持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
容器启动过程主要分为两步:容器启动阶段,bean 实例化阶段。这篇文章我们详细介绍一下容器启动的两个步骤中的各个扩展点。
1. 容器启动阶段
容器启动开始的时候,大部分情况会通过一些诸如BeanDefinitionReader 的工具类来解析Configuration Metadata。在这之后,会把分析得到的结果编辑整理为对应的BeanDefinition(BeanDefinition 我们都很清楚了),最后把这些保存着bean 定义的必要信息的BeanDefinition 注册到相应的BeanDefinitionRegistry 之中。这样一来,就完成了容器的启动工作。
看这个图会比较直观一些:
简单来说,这个阶段更多做的是收集对象的相关信息(如:从XML 中进行解析),是一种准备性的工作。
于是我们自然就可以想到,一些验证性的、辅助性的工作就可以放到这个阶段来完成。
2. bean 实例化阶段
在第一个阶段完成之后,所有bean 定义的信息都会加载到BeanDefinition 中并注册到BeanDefinitionRegistry。
在这个时候,如果某个请求要通过getBean 方法明确指明需要获取某个对象,或者因为依赖关系在容器中需要隐式地调用getBean 方法的时候,容器就会进入到第二阶段。
在这个阶段,根据请求调用的bean 的信息,容器会首先检查请求方想要获取的对象是否已经被初始化。如果没有,那么系统就会根据通过注册信息得到的BeanDefinition 提供的内容去实例化这个被请求的对象,然后给这个对象注入其所需要的依赖。
在上述过程完成之后,容器会给出一个具体的实例对象,然后将其返回给请求方使用。
这里可以将第一阶段的操作比作根据图纸装配生产线;那么第二阶段就相当于根据已经装配好的生产线去生产具体的产品。
总结
这篇文章分析了容器启动阶段流程中包含的各个扩展点。有了这些扩展点,我们就可以在这些扩展点来完成相关的定制化的工作了。