在 Spring 中,普通的 Java 对象,生命周期由 JVM 管理,而由 Spring IoC 容器托管的对象,它们的生命周期完全由 Spring IoC 容器控制
4个生命周期阶段
在 Spring 中每个 Bean 的生命周期只有 4 个阶段
实例化 -> 属性赋值 -> 初始化 -> 销毁
生命周期的前三个阶段都体现在在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean()
方法中,源码如下
// 省略了所有无关代码
protected Object doCreateBean(String beanName, RootBeanDefinition mbd,
@Nullable Object[] args) throws BeanCreationException {
// 实例化阶段!
instanceWrapper = this.createBeanInstance(beanName, mbd, args);
// 属性赋值阶段!
this.populateBean(beanName, mbd, instanceWrapper);
// 初始化阶段!
exposedObject = this.initializeBean(beanName, exposedObject, mbd);
}
createBeanInstance()
: 对应实例化阶段populateBean()
: 对应属性赋值阶段initializeBean()
: 对应初始化阶段
实例化阶段
完成 Bean 的实例化,但这个时候 Bean 中的属性(依赖还都是空的)
属性赋值阶段
获取or创建 Bean 的依赖对象,将他们填充到 Bean 中
初始化阶段
对 Bean 进行扩展或增强,Spring 提供了大量的扩展接口,如果我们的 Bean 实现了这些接口,并实现了接口里面的方法,那么在该阶段会依次调用这些接口的方法
这些接口注要分为三种
- xxxAware
- BeanPostProcessor
- InitializingBean
整个初始化阶段各接口的调用顺序
销毁阶段
Spring IoC 容器对 Bean 进行销毁,在这一阶段,如果 Bean 实现了 DisposableBean
接口,那么销毁之前会调用DisposableBean.destroy()
方法,在销毁之前进行一些清理工作
后记
虽然每个 Bean 的生命周期都会经历 实例化 -> 属性赋值 -> 初始化 -> 销毁 四个阶段,但不同的 Scope ,对应的每个阶段内部流程会有所不同
在描述此类问题时,最好是指明 Bean 的 Scope
以 singleton 作用域的 Bean 例,它的每个阶段详细执行情况参考Spring singleton Bean的生命周期