-
prepareRefresh()
- 设置容器启动时间
- 设置一些状态位标识,如active、closed
- 初始化占位符属性资源
- 创建环境对象,校验必填属性是否可解析
- 初始化一些成员变量,如earlyApplicationListeners(应用监听器)、earlyApplicationEvents(应用事件)
容器刷新前的一些预处理工作
-
obtainFreshBeanFactory()
- 创建bean工厂,类型是DefaultListableBeanFactory
- 设置bean工厂的序列化id
- 定制化bean工厂,其实也是设置一些属性,如allowBeanDefinitonOverring(bean定义信息是否可以重写)、allowCircularReferences(是否运行循环依赖)
- 加载bean定义信息,初始化BeanDifinitonReader读取器,将配置文件转化成输入流对象,通过SAX解析XML文件中的默认标签以及自定义标签内容,封装成BeanDefiniton,注册到DefaultListableBeanFactory的beanDefinitonMap中
创建DefaultListableBeanFactory工厂,给bean工厂设置一些属性,加载配置文件信息,封装成bean定义信息
-
prepareBeanFactory(beanFactory)
- 设置bean类加载器信息
- 添加一些BeanPostProcessor增强器
- 忽略一些接口的自动装配依赖
- 注册一些bean对象到容器中,如environment(环境变量)、systemProperties(系统属性)等
设置bean工厂的一些属性,如添加一些BeanPostProcessor增强器等
-
postProcessorBeanFactory(beanFactory)
模板方法,留给子类拓展实现
-
invokeBeanFactoryPostProcessors(beanFactory)
- 调用实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessors
- 调用实现了Ordered接口的BeanDefinitionRegistryPostProcessors
- 其它BeanDefinitionRegistryPostProcessors
- 调用实现了PriorityOrdered接口的BeanFactoryPostProcessor
- 调用实现了Ordered接口的BeanFactoryPostProcessor
- 调用其它BeanFactoryPostProcessor
执行BeanFactoryPostProcessor的postProcessorBeanFactory()增强方法
-
registerBeanPostProcessors(beanFactory)
- 注册实现了PriorityOrdered接口的BeanPostProcessor
- 注册实现了Ordered接口的BeanPostProcessor
- 注册其它BeanPostProcessor
注册BeanPostProcessor增强器 只是注册,真正执行是在初始化阶段的前后执行
-
initMessageSource()
初始化MessageSource,国际化处理
-
initApplicationEventMulticaster()
- 如果容器中存在applicationEventMulticaster,则直接获取,否则创建一个新的SimpleApplicationEventMulticaster, 并注册到容器中
初始化事件多播器
-
onRefresh()
- 在单例对象的实例化之前,允许子类做一下扩展
模板方法,留给子类扩展实现
-
registerListeners()
- 往applicationEventMulticaster事件多播器中注册一系列监听器
注册一些监听器
-
finishBeanFactorylnitialization(beanFactory)
- 循环遍历之前解析后的BeanDefinition定义信息
- 通过反射创建bean对象
- bean的属性填充populateBean()
- 调用Aware按口相关方法,如BeanNameAware.BeanFactoryAware等
- 执行BeanPostProcessor的postProcessBeforelnitialization()前置增强方法
- 执行InitializingBean的afterPropertiesSet()方法
- 执行自定义的初始化方法,如init-method等
- 执行BeanPostProcessor的postProcessAfterinitialization()后置增强方法
- 执行DisposableBean的destroy()销毁方法
- 执行自定义的销毁方法,如destroy-method等
IOC容器创建最重要的一个步骤:完成非懒加载的单例bean对家的实例化,包括反射创建bean对象、属性填充、循环依赖的处理、bean的初始化等等
-
finishRefresh()
- 清除资源缓存
- 初始化生命周期处理器,调用onRefresh()刷新方法
- 发布容器己刷新事件
容器刷新完成之后的一些处理工作
总结
-
第一步,首先会执行一些容器刷新前的准备工作,如设置容器启动时间、一些状态标志位等;
-
第二步,创建容器对象,其实就是实例化DefaultListableBeanFactory对象,这一步包含了bean定义信息的解析,解析后的属性都封装到DefaultListableBeanFactory的成员属性中了,如我们常见的beanDefinitionMap、beanDefinitionNames:
-
第三步,准备Bean工厂,实际上就是设置beanFactory的一些属性;
-
第四步,Spring提供了postProcessBeanFactory()方法给我们去扩展,例如我们可以注册一些特殊的BeanPostProcessor后置处理器等操作;
-
第五步,执行BeanFactoryPostProcessor后置处理器的postProcessBeanFactory()增强方法,使用三个不同的集合分别存放实现了PriorityOrdered接口、实现了Ordered接口、普通的BeanFactoryPostProcessor,经过排序后,执行BeanFactoryPostProcessor的回调postProcessBeanFactory();
-
第六步,注册BeanPostProcessor后置处理器,注意,这里还不会执行BeanPostProcessor对应的增强方法;同样的,使用三个不同的集合分别存放实现了PriorityOrdered接口、实现了Ordered接口、普通的BeanPostProcessor,依次调用beanFactory.addBeanPostProcessor(postProcessor)方法往bean工厂中添加BeanPostProcessor:
-
第七步,为上下文初始化MessageSource,即国际化处理;
-
第八步,初始化事件多播器,即Application EventMulticaster, 为后面的事件发布-监听做准备;
-
第九步,提供了一个模板方法onRefresh(),留给子类初始化其他的bean;
-
第十步,注册Listener监听器;
-
第十一步,也是最关键的一步,这里会实例化所有剩下的非懒加载的单例Bean,Bean的生命周期也是从这里开始的;
具体一点就是说,这里会获取到之前解析到的所有bean名称集合,挨个调用getBean(beanName)方法,然后经历doGetBean()、createBean()、doCreateBean()创建bean的流程,接着会通过反射创建出我们的bean实例对象,然后进行populateBean()属性填充,属性填充完成后,会执行bean的初始化,初始化bean过程主要执行Aware接口方法、执行初始化方法、回调BeanPostProcessor后置增强器的方法等。
-
第十二步,完成上下文的刷新工作,如清除些缓存、发布容器刷新完成的事件等;