Spring Bean 生命周期

生命周期完整流程

1️⃣ Bean 的创建(实例化)

步骤 1:实例化对象

Spring 启动,扫描或加载配置,查找并加载需要被 Spring 管理的 bean,进行 Bean 的实例化,doCreateBean() → createBeanInstance() 实例化对象。

2️⃣ 依赖注入(populateBean)

步骤 2:属性赋值

Bean 实例化后对 Bean 的属性进行赋值(依赖注入),populateBean 阶段完成依赖注入,尚未执行初始化逻辑。

3️⃣ Aware 接口回调

步骤 3:BeanNameAware

如果 Bean 实现了 BeanNameAware 接口的话,Spring 将 Bean 的 Id 传递给 setBeanName()方法。

步骤 4:BeanFactoryAware

如果 Bean 实现了 BeanFactoryAware 接口的话,Spring 将调用 setBeanFactory()方法,将 BeanFactory 容器实例传入。

步骤 5:ApplicationContextAware

如果 Bean 实现了 ApplicationContextAware 接口的话,Spring 将调用 Bean 的 setApplicationContext()方法,将 bean 所在应用上下文引用传入进来。

Spring 容器把自身信息传递给 Bean 的扩展点。

4️⃣ BeanPostProcessor(初始化前处理)

步骤 6:前置处理

如果 Bean 实现了 BeanPostProcessor 接口,Spring 就将调用他们的 postProcessBeforeInitialization()方法。

这里是 AOP / 代理生成的前置机会。

5️⃣ 初始化(init)

步骤 7:初始化方法

如果 Bean 实现了 InitializingBean 接口,Spring 将调用他们的 afterPropertiesSet()方法。类似的,如果 bean 使用 init-method 声明了初始化方法,该方法也会被调用。

6️⃣ BeanPostProcessor(初始化后处理)

步骤 8:后置处理

如果 Bean 实现了 BeanPostProcessor 接口,Spring 就将调用他们的 postProcessAfterInitialization()方法。

7️⃣ Bean 就绪(可使用)

步骤 9:Bean 可用

此时,Bean 已经完全初始化,依赖注入完成,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

8️⃣ Bean 销毁(容器关闭)

步骤 10:销毁方法

如果 bean 实现了 DisposableBean 接口,Spring 将调用它的 destory()接口方法,同样,如果 bean 使用了 destory-method 声明销毁方法,该方法也会被调用。

注意单例 Bean 全生命周期由容器管理,包括销毁;原型 Bean 容器只管创建和初始化,销毁由调用方负责。