Spring在加载配置文件的时候做了什么呢?
先来看下ApplicationContext的几个关键顶级接口:
1.BeanFactory
如上篇所示
2.ApplicaitonEventPublisher
发布应用上下文事件的功能
3.MessageSource
国际化的功能
4.ResourceLoader
加载resource的功能
5.LifeCycle
会将start/stop信息发送给所有实现了这个接口的bean,达到任务调度,jms的功能
AbstractApplicationContext是ApplicationContext的抽象实现类,类中的refresh方法定义了加载配置文件时候的流程
// Prepare this context for refreshing.
prepareRefresh(); //字面翻译呗
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
prepareBeanFactory(beanFactory);
try{
postProcessBeanFactory(beanFactory)//将配置文件中的bean 以Spring内部的形式保存(既以BeanDefinition的形式保存)这个方法得益于BeanFactory中 的一个顶级接口:BeanDefinitionRegisry(定义了手动注册BeanDefinition方法)
invokeBeanFactoryPostProcessors(beanFactory); //从BeanDeifnitionRegisry中找出所有实现了BeanFactoryPostProcessor的方法,并调用其postProcessBeanFactory方法.registerBeanPostProcessors(beanFactory);//注册BeanPostProcessor类,从BeanDefinitionRegistry中找出所有实现了BeanPostProcessor的类,并将它们注册到Bean后处理器的注册表中
initMessageSource();//初始化消息数据源,对应的顶级接口MessageSource
MessageSourceinitApplicationEventMulticaster();//初始化容器上下文事件广播器
ApplicaitonEventPublisheronRefresh();//初始化其他特殊的bean
registerListeners();//注册事件监听器
finishBeanFactoryInitialization(beanFactory);//初始化所有单实例的bean,懒加载的除外
finishRefresh();//发布上下文刷新事件;创建上下文刷新事件,事件广播器将事件广播到每个注册的事件监听器中}
关于Spring 从创建到销毁bean,再次可以进行进一步延伸(其实就是上篇博文的初略概述)
1.ResourceLoader 加载配置文件
2.BeanDefinitionReader 解析配置文件,并将其注册到BeanDefinitonRegistry中,此时的beanDefinition是半成品,因为此时还无法对
占位符进行解析
3.BeanFactoryPostProcessor从beanDefinitionRegistry中进行进一步加工(解析占位符),并且将实现了PropertyEditor接口的bean注册到PropertyEditorRegistry中
4.通过InstantiationStrategy 和BeanWrapper 完成bean的实例化,并进行属性的注入
5.通过BeanPostProcessor对bean进行进一步加工
上述组件的解释:
1.BeanDefiniton: 是bean在Spring内部的表现形式,顶级父类是BeanDefiniton <-AbstractBeanDefiniton- 我们知道Bean是可以配置他的父bean 的,因此顾名思义,RootBeanDefinition是parent bean,childBeanDefinition是child bean,若无parent,则直接是RootBeanDefinition,AbstractBeanDefinition 存放共有的信息 2.InststantiationStrategy: 策略实例化接口InstantiationStrategy<-SimpleInstantiationStrategy<-CglibSubClassingInstantiationStrategy,顾名思义呗,Simple方式,就是最常用的通过构造函数,或者工厂方法创建实例 而Cglib提供动态创建子类再进行实例化的方式 这个接口仅仅对bean进行实例化,具体的属性配置任务是交给BeanWrapper执行的 3.BeanWrapper:完成bean属性的填充工作 BeanWrapper的几个顶级接口: 1.PropertyAccessor:定义了访问bean属性的方法 2.PropertyEditorRegistry :从properEditoryRegistry中获取实现了PropertyEditor接口的实现类 BeanWrapper先从BeanDefinitonRegistry中获取beanDefiniton,再从beanDefinition中获取propertyValue,然后配合属性编辑器对propertyValue进行转换得到属性值,然后进行赋值,重复此操作 最后bean后置处理器:benaPostProcessor 对bean进行后续加工,一个完整的bean就诞生了