Spring容器内部工作机制
Spring启动时执行的操作
AbstractApplicationContext是ApplicationContext的抽象实现类,它的refresh方法定义了Spring启动时执行的操作。
AbstractApplicationContext中refresh()方法源码片段
使用设计模式的模版模式
//初始化BeanFacoty
prepareRefresh();
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
prepareBeanFactory(beanFactory);
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// 调用后工厂后置处理器
invokeBeanFactoryPostProcessors(beanFactory);
// 注册Bean后置处理器
registerBeanPostProcessors(beanFactory);
// 初始化消息源
initMessageSource();
// 初始化容器事件广播器
initApplicationEventMulticaster();
// 初始化其他特殊的Bean,这是个钩子方法,子类中具体实现
onRefresh();
// 注册事件监听器
registerListeners();
// 初始化所有单例的Bean
finishBeanFactoryInitialization(beanFactory);
//完成刷新并发布容器刷新事件
finishRefresh();
Spring启动时执行的操作图
-
ResourceLoader从存储介质中加载spring配置信息,并使用Resource标识这个配置文件的资源。
-
BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件,配置文件中的每一个<bean>被解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中。
-
容器扫描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射机制自动识别出Bean工厂后处理器的Bean,然后调用这些Bean工厂处理器对BeanDefinfitionRegistry中的BeanDefinition进行加工处理,主要完成两项工作:
(1)对使用到占位符的<bean>元素标签进行解析,得到最终的配置项,这意味着一些半成品额BeanDefinition对象加工处理并得到完整的BeanDefinition对象。
(2)对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过Java反射机制找出所有属性编辑器的Bean,并自动将他们注册到Spring容器的属性编辑器注册表中。
-
Spring容器从BeanDefinitionRegistry中取出加工后的BeanDefinition,并调用InstantiationStrategy着手进行Bean实例化的工作。
-
在实例化Bean时,Spring容器使用BeanWrapper对Bean进行封装,BeanWrapper提供了很多以Java反射机制操作Bean的方法,它将结合Bean的BeanDefinition以及容器中的属性编辑器,完成Bean属性的设置工作。
-
利用容器中注册的Bean后处理器对已经完成属性设置工作的Bean进行后续加工,直接装配出一个准备就绪的Bean。