@postconstruct在依赖注入完成后、bean放入容器前执行,@predestroy在bean销毁前调用;二者均为jsr-250标准注解,要求方法无参、void返回、非静态、类中唯一,分别用于初始化和资源清理。

@PostConstruct 和 @PreDestroy 是 Java EE(现 Jakarta EE)标准注解,Spring 完全兼容它们,用于在 Bean 初始化完成之后、销毁之前执行自定义逻辑,无需实现特定接口或继承基类,真正实现无侵入式生命周期管理。
什么时候触发 @PostConstruct
该方法在依赖注入全部完成、所有 @Autowired 字段和 @Resource 注入完毕后、Bean 被放入 Spring 容器前执行。它比 InitializingBean.afterPropertiesSet() 更早(后者在所有初始化回调之后),且不依赖 Spring 接口。
- 方法必须是 public、无参、返回 void
- 一个类中只能标注一个方法(否则抛出异常)
- 即使 Bean 是 prototype 作用域,每次创建实例时也会执行
- 若构造函数抛异常,@PostConstruct 不会执行
什么时候触发 @PreDestroy
该方法在 Bean 被销毁前调用,适用于单例 Bean 的容器关闭时,或 prototype Bean 被容器主动销毁(如通过 ConfigurableApplicationContext.close() 或手动调用 DisposableBean.destroy())时。注意:Spring 默认不管理 prototype Bean 的销毁,需显式触发。
- 方法必须是 public、无参、返回 void
- 仅对由 Spring 容器管理生命周期的 Bean 有效(如 singleton、或显式注册的 prototype)
- 若容器未正常关闭(如进程被 kill),@PreDestroy 可能不会执行
使用示例与注意事项
直接在组件类中添加注解即可,无需额外配置(Spring 5.0+ 默认启用 JSR-250 支持):
@Component
public class DataService {
@PostConstruct
public void init() {
System.out.println("初始化连接池、加载缓存等");
}
@PreDestroy
public void cleanup() {
System.out.println("释放资源、关闭连接等");
}
}
- 确保项目中存在
jakarta.annotation:jakarta.annotation-api(Spring 6+)或javax.annotation:javax.annotation-api(Spring 5.x)依赖 - 避免在 @PostConstruct 中执行耗时或可能失败的操作(如远程调用),否则会导致 Bean 创建失败
- @PreDestroy 不适用于静态资源或全局状态清理——它只针对当前 Bean 实例
与 Spring 原生机制的对比
@PostConstruct / @PreDestroy 属于通用 Java 标准,相比 Spring 特有的接口(如 InitializingBean、DisposableBean)或 init-method/destroy-method XML 配置,更轻量、更解耦。
- 不强制依赖 Spring API,利于测试和迁移
- 支持在非 Spring 环境(如 Jakarta EE 应用服务器)中复用相同逻辑
- 若同时存在 @PostConstruct 和
afterPropertiesSet(),前者先执行;同理 @PreDestroy 先于destroy()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











