本文编写于 981 天前,最后修改于 969 天前,其中某些信息可能已经过时。
Spring Bean生命周期
调用 getBean(name)
方法来加载name对应的单例对象,这里只分析Spring的单例对象生命周期。
- 转换并解析bean的名称,处理bean别名,获取到真正的bean名称;
- 如果beanName是以
&
开头的,就返回FactoryBean
的工厂对象本身; - 如果获取的是以
FactoryBean
工厂自定义创建的实例对象,那么就通过FactoryBean
的getObject
方法来创建单例对象; 从缓存中获取单例bean;
- 先从单例缓存(一级缓存
singletonObjects
)中获取; - 如果一级获取不到,则判断当前bean是否正在创建,如果当前bean正在创建,则从早期单例缓存(二级缓存
earlySingletonObjects
)中获取; - 如果二级缓存获取不到,则判断当前容器是否允许早期引用,如果允许早期引用,则从对象工厂缓存(三级缓存
singletonFactories
)获取bean的对象工厂ObjectFactory
; - 调用
ObjectFactory
的getObject
方法创建早期单例bean,并将早期单例添加到早期单例缓存(二级缓存earlySingletonObjects
)中。
- 先从单例缓存(一级缓存
如果成功获取到单例bean,先尝试通过
FactoryBean
来实例化bean;- 判断name是否以
&
开头,如果单例bean是FactoryBean
实例,返回单例bean; - 判断单例是否是
FactoryBean
的实例,调用FactoryBean
的getObject
方法创建单例bean,返回单例bean。
- 判断name是否以
- 未获取到单例bean,开始创建单例bean;
- 检查当前是否存在
prototy
类型的bean正在创建(prototy
类型的bean无法解决循环依赖的问题); - 标记
beanName
对应的bean开始创建; - 获取bean的
BeanDefinition
并封装为RootBeanDifition
(RootBeanDifition
包含父类Bean的定义信息); - 注册并提前初始化bean依赖的那些bean;
- 提供一个扩展点,通过后置处理器
InstantiationAwareBeanPostProcessor
的postProcessBeforeInstantiation
方法创建并返回一个代理对象,结束创建流程; - 记录beanName对应的bean开始创建;
正式创建单例bean;
- 解析
BeanDifinition
中bean属性class; - 在
BeanDifinition
中预先标记没有重载的方法; - 通过反射创建bean的实例;
- 将bean的实例封装到
BeanWrapperImpl
中; - 通过后置处理器
MergedBeanDefinitionPostProcessor
的方法postProcessMergedBeanDefinition
用来合并一些信息到BeanDefinition
,例如将添加了@Autoired
、@Resource
等注解信息加入到BeanDefinition
中,默认的处理器有:CommonAnnotationBeanPostProcessor
、AutowiredAnnotationBeanPostProcessor
、InitDestroyAnnotationBeanPostProcessor
等; - 当前bean为单例,设置允许循环且bean正在创建;
- 添加创建早期单例bean的对象工厂
ObjectFactory
到三级缓存中(对象工厂缓存singleFactories
); - 调用后置处理器
InstantiationAwareBeanPostProcessor
的postProcessAfterInstantiation
方法来去修改bean的状态,如果该方法返回false
,将会跳过步骤9及步骤10(即为bean填充各种属性值); - 通过后置处理器
InstantiationAwareBeanPostProcessor
的postProcessProperties
方法处理bean属性值的扩展点,其中AutowiredAnnotationBeanPostProcessor
后置处理器用于处理带有@Autowired
和@Value
注解的字段,利用反射API来完成属性值的注入; - 为bean填充各种属性值;
- 调用感知接口的方法(即相关Aware接口),为bean注入容器中的内置对象;
- 在bean初始化之前通过后置处理器
BeanPostProcessor
的postProcessBeforeInitialization
方法调整bean; - 通过后置处理器
InitDestroyAnnotationBeanPostProcessor
的postProcessBeforeInitialization
方法来执行@PostConstruct
注解标注的初始化方法; 执行bean中的初始化方法:
- 先判断bean是否实现
InitializingBean
接口,如果实现则执行afterPropertiesSet
方法; - 执行初始化方法
init-method
中指定的方法;
- 先判断bean是否实现
- 在bean初始化之后通过后置处理器
BeanPostProcessor
的postProcessAfterInitialization
方法调整bean,其中后置处理器AnnotationAwareAspectJAutoProxyCreator
在其抽象父类的父类的父类AbstractAutoProxyCreator
中的postProcessAfterInitialization
方法中实现了AOP功能; 注册
DisponsableBeanAdapter
在销毁bean时执行方法:- 先调用后置处理器
DestructionAwareBeanPostProcessor
的postProcessBeforeDestruction
方法来执行bean的销毁处理,默认的后置处理器InitDestroyAnnotationBeanPostProcessor
的postProcessBeforeDestruction
方法用来执行@PreDestroy
注解标注的销毁方法; - 先判断bean是否实现
DisponsableBean
接口,如果实现则执行destroy
方法; - 执行销毁方法
destory-mehtod
中指定的方法;
- 先调用后置处理器
- 解析
- 如果是首次创建实例bean,需要将创建好的实例bean添加到单例缓存(一级缓存
singletonObjects
)中,删除对象工厂缓存(三级缓存singletonFactories
)和早期单例缓存(二级缓存earlySingletonObjects
)中对应的缓存。并在registeredSingletons
中记录已经创建过的bean名称, 防止单例bean的重复创建; - 检查是否需要转换对象的类型。