bean启动流程
通常我们定义xml、yaml文件,需要一个解析器将xml信息读到beandefinition中,这个就是备案DefinitionReader,实际上是创建了一个xmlbeanDefinitionReader,然后将解析好的document文件设置到BeanDefinition,此时需要将BeanDefinition设置到beanfactory中,需要设置beanDefinitionMap与beanDefinitionName。生成完成了beandefition后,需要经过beanFactoryPostProcessor,通常是对beanDefinition做一些增强,比如这里有对xml文件的${}的替换函数 PlaceholderConfigurerSupport。然后就是bean的生命周期了,这里首先需要实例化,对bean默认值,然后就是初始化操作了。
初始化操作分为5个步骤,首先需要对bean赋真正意义的值,其次设置aware接口属性,比如果需要容器的其他对象,此时可以将对象实现Aware接口,来满足当前的需要。然后就到了beanbeforePostProcessor、init-method、beanAfterPostProcessor。通常AOP操作就在beanAfterPostProcessor。
这里注意FactoryBean与BeanFactory有什么区别?
都是用来创建对象的当使用BeanFactory的时候必须要遵循完整的创建过程,这个过程是由spring来管理控制的,而使用FactoryBean只需要调用getObject就可以返回具体的对象,整个对象的创建过程是由用户自己来控制的,更加灵活。FactoryBean只需要三个参数,IsSingleton、getObject、getObjectType。
ReFlush方法
作为Spring的AbstractApplicationContext的reflush方法,大名鼎鼎,基本可以说只要理解reflush方法,Spring源码就通透了。这里简单的写一下12个方法的作用。
1、首先是prepareRefresh方法,作容器刷新前的准备工作。
主要工作:设置开机时间(stattupDate),设置活跃的标志位(active)、获取环境对象(getEnvironment)、设置监听器与监听事件的集合(但是都是空的)(在springboot有用)。
2、ObtainFreshBeanFactory方法,获得一个bean工厂;有两个工厂,listablebeanFactory(课以枚举的bean工厂)与configurableBeanFactory,configurebeanFactoy父接口时HirearchicalBeanFactory(可以继承关系的bean工厂)。而defaultListableBeanFactory就是默认创建的bean工厂。OFBF方法里有refreshbeanfactory,主要逻辑判断是否有bean工厂,没有那么创建,用createbeanfactory方法创建defaultlistablebeanfactory默认工厂。后面对工厂赋属性值,包括loadbeandefinitions,加载beandefinition。
主要工作:创建容器对象,并加载xml配置文件的属性到当前工厂中,最重要的时BeanDefinition加载了。
3、PrepareBeanFactory方法,增加beanpostprocessor,还有忽略aware。
主要工作:设置对beanFactory某些初始化操作。
4、PostprocessBeanFactory方法,执行beanfactory的后置处理器,但是里面空的,扩展用的。
5、InvokeBeanFactoryPostProcessors()方法,在实例化之前必须要调用。
主要工作:实例化并且执行beanfactorypostprocessor操作。
6、registerBeanPostProcessors方法(前戏工作)实例化并注册所有beanpostProcessor。
7、initMessageSource方法(前戏工作)国际化的设置,无所谓的。
8、InitApplicationEventMulticaster方法,(前戏工作)初始化事件的广播器
9、OnRefresh方法,(前戏工作)也是空方法实现,springboot给tomcat
10、RegisterListeners方法,(前戏工作)注册监听器的方法
11、FinishBeanFactoryInitialization方法,实例化与初始化都在这里完成的。很重要!!!
12、FinishRefresh方法
接下来记录下debug源码跟进去的各个方法的作用。