Spring Bean 的生命周期

415 阅读2分钟

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

整个初始化阶段各接口的调用顺序 image.png

销毁阶段

Spring IoC 容器对 Bean 进行销毁,在这一阶段,如果 Bean 实现了 DisposableBean 接口,那么销毁之前会调用DisposableBean.destroy() 方法,在销毁之前进行一些清理工作

后记

虽然每个 Bean 的生命周期都会经历 实例化 -> 属性赋值 -> 初始化 -> 销毁 四个阶段,但不同的 Scope ,对应的每个阶段内部流程会有所不同

在描述此类问题时,最好是指明 BeanScope

singleton 作用域的 Bean 例,它的每个阶段详细执行情况参考Spring singleton Bean的生命周期