Spring Bean的生命周期
生命周期的三个阶段(概述)
Spring Bean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体分为三个阶段:
1.Bean的实例化阶段
Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是singleton的,是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化;
2.Bean的初始化阶段(概述文章后面有细讲)
Bean创建之后还仅仅是个"半成品",还需要对Bean实例的属性进行填充、执行一些Aware接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方法、执行自定义初始化init方法等。该阶段是Spring最具技术含量和复杂度的阶段,AOP增强功能,后面要学的Spring注解功能等等
Spring高频面试题Bean的循环引用问题都是在这个阶段体现
3.Bean的完成阶段
经过初始化阶段,Bean就成为了一个完整的SpringBean,被存储到单例池singletonObjects中去了,即完成了Spring Bean的整个生命周期
Bean的初始化阶段
由于Bean的实例化阶段的步骤比较复杂,所以着重研究Bean的初始化阶段
Spring Bean的初始化过程涉及如下几个过程
1.Bean实例的属性填充
2.Aware接口属性注入
3.BeanPostProcessor的before()方法回调
4.InitializingBean接口的初始化方法回调
5.自定义初始化方法init回调
6.BeanPostProcessor的after()方式回调
PS:通过代码验证上述初始化顺序
1.Bean实例的属性填充
BeanDefinition中对当前Bean实体的注入信息通过属性propertyValues进行存储
BeanDefinition中对当前Bean实体的注入信息通过属性propertyValues进行存储
Spring在进行属性注入时,会分为如下几种情况:
注入普通属性
注入普通属性。String,int或存储基本类型的集合时,直接通过set方法的反射设置进去;
注入单向对象引用属性
注入单向对象引用属性时。从容器中getBean获取后通过set方法反射设置进去,如果容器中没有,则先创建被注入对象Bean实例(完成整个生命周期)后,在进行注入操作;
例如:
顺序
注入双向对象引用属性
注入双向对象引用属性时,就比较复杂了,涉及循环引用(循环依赖)问题,下面会详细阐述解决方案。
多个实体之间相互依赖并形成闭环的情况就叫做“循环依赖”,也叫做“循环引用”
未解决流程(死循环)因为必须加载到单例池中才是一个完成的bean
解决方案如下:把半成品bean实例和完成bean实例存储起来(对应上图灰色菱形方块判断)
图片黑马程序员,文章为本人学习笔记