Spring的Bean的生命周期
获取Bean
第一阶段获取Bean
这里的流程图入口在AbstractBeanFactory 类的doGetBean方法,这里可以配合前面的getBean方法分析,主要流程是
-
先处理Bean的名称,因为如果以 "&" 开头的Bean名称标识获取的是对应的FactoryBean对象;
-
从缓存中获取单例Bean,有则进一步判断这个Bean 是不是再创建中,如果是的就等待创建完毕,否则直接返回这个Bean对象
-
如果不存在单例Bean缓存,则先进行循环依赖的解析
-
解析完毕之后先获取父类BeanFactory,获取到了则调用父类的getBean 方法,不存在则先合并然后创建Bean
创建Bean
创建Bean之前
在真正创建Bean之前逻辑
这个流程图对应的代码在AbstractAutowireCapableBeanFactory类的 createBean方法中。
- 这里或先获取 RootBeanDefinition 对象中的Class对象并确保已经关联了要创建的Bean的Class。
- 这里会检查3个条件
- Bean的属性中的 beforeInstantiationResolved 字段是否为true,默认是 false。
- Bean是原生的Bean
- Bean的hasInstantiationAwareBeanPostProcessors属性为true,这个属性在Spring准备刷新容器前转为BeanPostProcessors 的时候会设置,如果当前Bean实现了InstantiationAwareBeanPostProcessor 则这个就会是true
当三个条件都存在的时候,就会调用实现 InstantiationAwareBeanPostProcessor接口的postProcessorBeforeInstantiation方法,然后获取返回的Bean,如果返回的Bean不是null还会调用实现BeanPostProcessors接口的postProcessAfterInitialization 方法,看代码说明
如果上面3个条件其中一个不满足就不会调用实现的方法。默认这里都不会调用这些BeanPostProcessors 的实现方法,然后继续执行后面的doCreateBean 方法。
真正的创建Bean。doCreateBean
doCreateBean方法逻辑
这个代码的实现还是在AbstractAutowireCapableBeanFactory方法中。流程是
- 先检查instanceWrapper 变量是不是null,这里一般是null除非当前正在创建得Bean在factoryBeanInstanceCache中存在这个是保存还没创建完成的FacotryBean的集合。
- 调用createBeanInstance方法实例化Bean
- 如果当前RootBeanDefinition对象还没有调用过实现了的 MergedBeanDefinitionPostProcessor接口的方法,则会进行调用
- 当满足一下三点
- 是单例bean
- 尝试解析bean之间的循环引用
- bean目前正在创建中
则会进一步检查是否实现了SmartInstantiationAwareBeanPostProcessor 接口如果实现了则调用是实现的getEarlyBeanReference方法
- 调用populateBean 方法进行属性填充,这里后面会讲解
- 调用initialzeBean 方法对Bean 进行初始化
实例化Bean,createBeanInstance
实例化Bean
destory方法跟销毁Bean
Bean创建完毕之后会检查用户是否指定了 destoryMethodName以及是否实现了DestructionAwareBeanPostProcessor接口的requireDestruction方法,如果指定了会记录下来保存在DisposableBeanAdapter 对象中并保存在bean的disposableBeans 属性中。代码在啊AbstractBeanFactory的
总结
完成的大流程
-
实例化前准备的阶段
-
实例化前
-
实例化后
-
初始化前
-
初始化后+销毁