🌱 一、什么是 Bean 生命周期?
在 Spring 容器中,一个 Bean 从“创建 → 初始化 → 使用 → 销毁”,经历了完整的生命周期。
Spring 提供了 多个扩展点 让你可以在这些阶段做事情,比如注入资源、日志记录、连接资源、清理工作等等。
🧭 二、完整生命周期流程图
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(推荐方式)
@Component
public class MyBean {@PostConstructpublic void init() {System.out.println("Bean 初始化完成");}@PreDestroypublic void destroy() {System.out.println("Bean 即将销毁");}
}
✅ 2)实现接口方式(稍显传统)
public class MyBean implements InitializingBean, DisposableBean {public void afterPropertiesSet() {System.out.println("初始化完成");}public void destroy() {System.out.println("销毁前回调");}
}
✅ 3)通过配置指定 initMethod / destroyMethod
@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 |