1.核心概念定义
Spring Bean 生命周期:指 Spring 容器中 Bean 从「实例化(创建对象)」→「属性赋值(依赖注入)」→「初始化(自定义逻辑)」→「使用(对外提供服务)」→「销毁(资源清理)」的完整过程,Spring 提供了多个扩展点允许开发人员干预该过程。
2. Bean 生命周期完整流程
2.1 流程总览(可视化)
实例化 Bean(new 对象)
设置 Bean 属性(依赖注入)
调用 BeanNameAware 的 setBeanName 方法
调用 BeanClassLoaderAware 的 setBeanClassLoader 方法
调用 BeanFactoryAware 的 setBeanFactory 方法
调用 ApplicationContextAware 的 setApplicationContext 方法
调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法(前置处理)
调用 InitializingBean 的 afterPropertiesSet 方法
调用自定义 init-method 方法
调用 BeanPostProcessor 的 postProcessAfterInitialization 方法(后置处理)
Bean 就绪,对外提供服务
容器关闭时:调用 DisposableBean 的 destroy 方法
调用自定义 destroy-method 方法
graph TD
A[实例化 Bean(new 对象)] --> B[设置 Bean 属性(依赖注入)]
B --> C[调用 BeanNameAware 的 setBeanName 方法]
C --> D[调用 BeanClassLoaderAware 的 setBeanClassLoader 方法]
D --> E[调用 BeanFactoryAware 的 setBeanFactory 方法]
E --> F[调用 ApplicationContextAware 的 setApplicationContext 方法]
F --> G[调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法(前置处理)]
G --> H[调用 InitializingBean 的 afterPropertiesSet 方法]
H --> I[调用自定义 init-method 方法]
I --> J[调用 BeanPostProcessor 的 postProcessAfterInitialization 方法(后置处理)]
J --> K[Bean 就绪,对外提供服务]
K --> L[容器关闭时:调用 DisposableBean 的 destroy 方法]
L --> M[调用自定义 destroy-method 方法]
实例化 Bean(new 对象)
设置 Bean 属性(依赖注入)
调用 BeanNameAware 的 setBeanName 方法
调用 BeanClassLoaderAware 的 setBeanClassLoader 方法
调用 BeanFactoryAware 的 setBeanFactory 方法
调用 ApplicationContextAware 的 setApplicationContext 方法
调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法(前置处理)
调用 InitializingBean 的 afterPropertiesSet 方法
调用自定义 init-method 方法
调用 BeanPostProcessor 的 postProcessAfterInitialization 方法(后置处理)
Bean 就绪,对外提供服务
容器关闭时:调用 DisposableBean 的 destroy 方法
调用自定义 destroy-method 方法
2.2 各阶段详细说明
| 阶段序号 | 阶段名称 | 核心作用 | 新手易懂解释 |
|---|---|---|---|
| 1 | 实例化 Bean | 创建 Bean 实例,在内存中分配空间 | 相当于执行 new UserBean() 创建空对象 |
| 2 | 设置 Bean 属性 | 为 Bean 的属性赋值(包括依赖注入其他 Bean) | 给空对象的 name、age 等属性赋值,或注入 DataSource 等依赖 Bean |
| 3 | Aware 接口回调 | 让 Bean 感知 Spring 容器的核心信息(名称、类加载器、容器实例等) | 告诉 Bean:「你的名字是 userBean」「你所属的容器是 ApplicationContext」 |
| 4 | BeanPostProcessor 前置 | 初始化前的全局自定义增强,可修改 Bean 属性甚至替换 Bean | 初始化前的「钩子函数」,对所有 Bean 生效(可指定过滤) |
| 5 | 初始化(内置接口) | 执行 InitializingBean 接口的 afterPropertiesSet 方法,完成核心初始化逻辑 | Spring 内置的初始化入口,属性赋值完成后自动触发 |
| 6 | 初始化(自定义方法) | 执行自定义的 init-method 方法,完成业务侧初始化逻辑 | 开发人员自定义的初始化方法(如加载配置、创建连接池) |
| 7 | BeanPostProcessor 后置 | 初始化后的全局自定义增强,是修改 Bean 的最后机会 | 初始化完成后的「钩子函数」,可对 Bean 做最终调整 |
| 8 | Bean 就绪使用 | Bean 完成所有初始化,对外提供业务服务 | Bean 可以被正常调用,执行 userService.doSomething() 等业务逻辑 |
| 9 | 销毁(内置接口) | 容器关闭时执行 DisposableBean 接口的 destroy 方法,清理核心资源 | Spring 内置的销毁入口,容器关闭时自动触发 |
| 10 | 销毁(自定义方法) | 执行自定义的 destroy-method 方法,完成业务侧资源清理 | 开发人员自定义的销毁方法(如关闭连接池、释放文件句柄) |
3. 实操示例
3.1 环境说明
- 框架:Spring Boot 2.x/3.x
- 核心依赖:spring-context(Spring Boot 已自动引入)
- 实现目标:通过代码验证 Bean 生命周期各阶段的执行顺序
3.2 代码实现
3.2.1 自定义 Bean(包含生命周期钩子)
package com.example.demo.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* 演示 Bean 生命周期的自定义 Bean
* 实现多个 Aware 接口、InitializingBean、DisposableBean 接口,覆盖生命周期关键扩展点
*/
@Component
public class LifecycleDemoBean implements
BeanNameAware, BeanClassLoaderAware, BeanFactoryAware,
ApplicationContextAware, InitializingBean, DisposableBean {
private String demoName;
// 阶段1:实例化 - 构造器
public LifecycleDemoBean() {
System.out.println("【1. 实例化】LifecycleDemoBean 构造器执行");
}
// 阶段2:属性赋值 - setter 方法
public void setDemoName(String demoName) {
this.demoName = demoName;
System.out.println("【2. 属性赋值】demoName 属性赋值:" + demoName);
}
// 阶段3:Aware 回调 - BeanNameAware
@Override
public void setBeanName(String beanName) {
System.out.println("【3. Aware 回调】BeanNameAware - Bean 名称:" + beanName);
}
// 阶段3:Aware 回调 - BeanClassLoaderAware
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
System.out.println("【3. Aware 回调】BeanClassLoaderAware - 类加载器:" + classLoader);
}
// 阶段3:Aware 回调 - BeanFactoryAware
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("【3. Aware 回调】BeanFactoryAware - BeanFactory 实例:" + beanFactory);
}
// 阶段3:Aware 回调 - ApplicationContextAware
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("【3. Aware 回调】ApplicationContextAware - ApplicationContext 实例:" + applicationContext);
}
// 阶段5:初始化 - InitializingBean 接口
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("【5. 初始化】InitializingBean - afterPropertiesSet 方法执行");
}
// 阶段6:初始化 - 自定义 init-method
public void customInitMethod() {
System.out.println("【6. 初始化】自定义 init-method - customInitMethod 方法执行");
}
// 阶段8:业务方法 - Bean 就绪后使用
public void doBusiness() {
System.out.println("【8. 服务使用】LifecycleDemoBean 执行业务逻辑:demoName = " + demoName);
}
// 阶段9:销毁 - DisposableBean 接口
@Override
public void destroy() throws Exception {
System.out.println("【9. 销毁】DisposableBean - destroy 方法执行");
}
// 阶段10:销毁 - 自定义 destroy-method
public void customDestroyMethod() {
System.out.println("【10. 销毁】自定义 destroy-method - customDestroyMethod 方法执行");
}
}
3.2.2 全局 BeanPostProcessor 实现
package com.example.demo.processor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
/**
* 自定义 BeanPostProcessor,实现初始化前后的全局处理
*/
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
// 阶段4:初始化前置处理
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if ("lifecycleDemoBean".equals(beanName)) {
System.out.println("【4. BeanPostProcessor】前置处理 - 处理 LifecycleDemoBean");
}
return bean; // 返回原 Bean(可替换为新 Bean)
}
// 阶段7:初始化后置处理
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("lifecycleDemoBean".equals(beanName)) {
System.out.println("【7. BeanPostProcessor】后置处理 - 处理 LifecycleDemoBean");
}
return bean;
}
}
3.2.3 配置类(可选,替代 @Component)
若不使用 @Component 注解,可通过 @Bean 显式配置 Bean 并指定初始化 / 销毁方法:
package com.example.demo.config;
import com.example.demo.bean.LifecycleDemoBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfig {
@Bean(initMethod = "customInitMethod", destroyMethod = "customDestroyMethod")
public LifecycleDemoBean lifecycleDemoBean() {
LifecycleDemoBean bean = new LifecycleDemoBean();
bean.setDemoName("测试名称");
return bean;
}
}
3.2.4 测试主类
package com.example.demo;
import com.example.demo.bean.LifecycleDemoBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class BeanLifecycleApplication {
public static void main(String[] args) {
// 1. 启动 Spring 容器,触发 Bean 生命周期
ConfigurableApplicationContext context = SpringApplication.run(BeanLifecycleApplication.class, args);
// 2. 获取 Bean 并执行业务方法
LifecycleDemoBean demoBean = context.getBean(LifecycleDemoBean.class);
demoBean.doBusiness();
// 3. 关闭容器,触发 Bean 销毁
context.close();
}
}
3.3 执行结果(关键顺序)
【1. 实例化】LifecycleDemoBean 构造器执行
【2. 属性赋值】demoName 属性赋值:测试名称
【3. Aware 回调】BeanNameAware - Bean 名称:lifecycleDemoBean
【3. Aware 回调】BeanClassLoaderAware - 类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@xxxx
【3. Aware 回调】BeanFactoryAware - BeanFactory 实例:org.springframework.beans.factory.support.DefaultListableBeanFactory@xxxx
【3. Aware 回调】ApplicationContextAware - ApplicationContext 实例:org.springframework.context.annotation.AnnotationConfigApplicationContext@xxxx
【4. BeanPostProcessor】前置处理 - 处理 LifecycleDemoBean
【5. 初始化】InitializingBean - afterPropertiesSet 方法执行
【6. 初始化】自定义 init-method - customInitMethod 方法执行
【7. BeanPostProcessor】后置处理 - 处理 LifecycleDemoBean
【8. 服务使用】LifecycleDemoBean 执行业务逻辑:demoName = 测试名称
【9. 销毁】DisposableBean - destroy 方法执行
【10. 销毁】自定义 destroy-method - customDestroyMethod 方法执行
4. 常见扩展场景
| 扩展点 | 典型使用场景 |
|---|---|
| InitializingBean/init-method | 初始化数据库连接池、加载配置文件、初始化缓存等 |
| DisposableBean/destroy-method | 关闭数据库连接、释放文件资源、清空缓存等 |
| BeanPostProcessor | 全局修改 Bean 属性、添加统一的日志埋点、Bean 代理增强(如 AOP 底层实现) |
| Aware 接口 | 获取 Bean 名称、容器实例,实现与 Spring 容器的交互 |
5. 注意事项
- BeanPostProcessor 是全局生效的,需通过 BeanName 过滤避免影响无关 Bean;
- 初始化方法(afterPropertiesSet/init-method)执行顺序:afterPropertiesSet 优先于自定义 init-method;
- 销毁方法仅在容器正常关闭时触发(如调用
context.close()),非正常关闭(如 kill 进程)不会执行; - 原型(Prototype)Bean 的销毁方法不会被 Spring 容器管理,需开发人员手动调用。
6. 总结
- 核心流程:Spring Bean 生命周期的核心是「实例化 → 属性赋值 → 初始化 → 使用 → 销毁」,其中初始化和销毁阶段支持自定义扩展;
- 扩展能力:Aware 接口提供容器感知能力,BeanPostProcessor 提供全局 Bean 增强能力,初始化 / 销毁方法提供业务侧自定义逻辑入口;
- 实操关键:自定义初始化 / 销毁逻辑时,可选择实现内置接口(InitializingBean/DisposableBean)或配置自定义方法(init-method/destroy-method),后者更解耦,推荐优先使用。