spring bean 生命周期分为实例化、属性填充、初始化、使用、销毁五阶段,初始化按@postconstruct→afterpropertiesset→init-method顺序执行,销毁按@predestroy→destroy→destroy-method逆序执行。

Spring Bean 的生命周期不是“写完代码就自动运行”的黑盒过程,而是容器严格按阶段推进的可控流程。理解它,关键在于分清“谁在什么时候做什么”,而不是死记方法名。
生命周期本质是五步递进过程
Bean 从无到有、再到退出,实际走的是明确的五个阶段:
- 实例化:仅调用构造函数(或工厂方法),对象刚“出生”,字段全为 null,依赖还没注入
- 属性填充:完成 @Autowired、@Value 等依赖注入,对象有了基本能力,但尚未“上岗”
- 初始化:执行所有初始化回调——这是你做准备工作的黄金窗口,比如连接池预热、缓存预加载
- 使用:Bean 被注入其他类、响应请求、参与业务逻辑,此时它处于活跃状态
- 销毁:容器关闭前触发清理动作,如关闭线程池、释放数据库连接、注销监听器
初始化三类方式怎么选
它们不是并列替代关系,而是有固定执行顺序,且适用场景不同:
- @PostConstruct:JSR-250 标准注解,不依赖 Spring,推荐用于轻量初始化(如日志打印、简单校验)
- InitializingBean 接口:强制实现 afterPropertiesSet(),适合需要强契约约束的模块,但让业务类耦合 Spring API
- init-method:通过 @Bean(initMethod="xxx") 指定任意 public 无参方法,完全解耦,适合已有工具类复用
注意:三者会按 @PostConstruct → afterPropertiesSet → init-method 顺序执行,不能跳过或乱序。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
销毁回调同样有三兄弟
销毁阶段的逻辑必须可靠,否则可能引发资源泄漏:
- @PreDestroy:标准注解,语义清晰,适合常规释放操作(如关闭流、取消定时任务)
- DisposableBean 接口:提供 destroy() 方法,适合需与 InitializingBean 成对使用的场景
- destroy-method:配置指定方法名,和 init-method 对应,适合遗留系统迁移或避免接口污染
销毁顺序与初始化相反:@PreDestroy → destroy() → destroy-method,确保前置清理先于后置释放。
真正容易踩坑的细节
很多问题其实源于对阶段边界的误解:
- “为什么 @PostConstruct 里拿不到 @Autowired 的字段?”——因为该注解在属性填充之后执行,但如果字段是 final 或未正确标注,仍可能为空
- “为什么 destroy-method 没被调用?”——只有单例 Bean 且容器正常关闭(如调用 context.close())才会触发;prototype Bean 不走销毁流程
- “BeanPostProcessor 和初始化方法谁先?”——前者在初始化方法前后各执行一次(postProcessBeforeInitialization / postProcessAfterInitialization),可用于包装代理、校验字段等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










