🌱 一、什么是 Bean 生命周期?
在 Spring 容器中,一个 Bean 从"创建 → 初始化 → 使用 → 销毁",经历了完整的生命周期。
Spring 提供了 多个扩展点 让你可以在这些阶段做事情,比如注入资源、日志记录、连接资源、清理工作等等。
🧭 二、完整生命周期流程图
plaintext
BeanDefinition 加载
↓
实例化(new)
↓
依赖注入(@Autowired、@Value)
↓
Aware 接口(BeanNameAware、ApplicationContextAware)
↓
BeanPostProcessor(初始化前)
↓
初始化方法(@PostConstruct / InitializingBean.afterPropertiesSet)
↓
BeanPostProcessor(初始化后)
↓
Bean 准备就绪,可以使用
↓
销毁前回调(@PreDestroy / DisposableBean.destroy)
↓
Bean 被销毁(容器关闭)
🔧 三、常用生命周期扩展点
阶段 | 使用方式 | 示例 |
---|---|---|
实例化后注入前 | 构造器 / @Autowired |
构造函数 + 依赖注入 |
设置 bean 名称 | BeanNameAware |
获取当前 Bean 的 ID |
设置容器引用 | ApplicationContextAware |
拿到整个容器对象 |
初始化前 | BeanPostProcessor.postProcessBeforeInitialization() |
可对 Bean 进行加工 |
初始化中 | @PostConstruct 或 InitializingBean |
初始化数据库连接等 |
初始化后 | BeanPostProcessor.postProcessAfterInitialization() |
可返回代理对象 |
销毁前 | @PreDestroy 或 DisposableBean |
清理资源、关闭线程等 |
✅ 1)@PostConstruct / @PreDestroy(推荐方式)
java
@Component
public class MyBean {
@PostConstruct
public void init() {
System.out.println("Bean 初始化完成");
}
@PreDestroy
public void destroy() {
System.out.println("Bean 即将销毁");
}
}
✅ 2)实现接口方式(稍显传统)
java
public class MyBean implements InitializingBean, DisposableBean {
public void afterPropertiesSet() {
System.out.println("初始化完成");
}
public void destroy() {
System.out.println("销毁前回调");
}
}
✅ 3)通过配置指定 initMethod / destroyMethod
java
@Bean(initMethod = "init", destroyMethod = "cleanup")
public MyBean myBean() {
return new MyBean();
}
🧠 四、BeanPostProcessor 的作用?
这是一种非常强大的机制:
你可以在 Bean 初始化前后 对所有 Bean 做增强,比如 AOP、自动代理、注入属性等等。
Spring 的很多高级功能(如 @Transactional
、@Async
)其实都是基于这个机制实现的!
🎯 五、一句话总结
Spring Bean 生命周期 = 一套结构清晰、可定制的生命周期钩子机制,让你能够在合适时机对 Bean 做初始化、增强和清理。
✅ 实战建议
情况 | 用法 |
---|---|
需要注入资源后初始化 | @PostConstruct |
需要关闭资源或线程池 | @PreDestroy |
想拦截 Bean 生命周期 | 实现 BeanPostProcessor |
需要容器对象 | 实现 ApplicationContextAware |
对生命周期感兴趣 | 打开 debug log,跟踪 AbstractAutowireCapableBeanFactory |