spring中bean销毁前资源清理首选@predestroy和disposablebean:前者是jsr-250标准注解,轻量预处理;后者是spring原生接口,用于阻塞式收尾,执行顺序为先@predestroy后destroy()。

在 Spring 中,Bean 销毁前做资源清理,核心是让容器在关闭时自动触发你的释放逻辑。DisposableBean 和 @PreDestroy 是两种主流方式,它们定位不同、触发时机有别,配合使用更稳妥。
DisposableBean 接口:Spring 原生的销毁回调
实现 DisposableBean 接口,重写 destroy() 方法,Spring 容器关闭时会自动调用它。
- 适用于需要与 Spring 生命周期深度耦合的场景,比如管理线程池、连接池等重量级资源
- 方法签名固定:
public void destroy() throws Exception,必须声明为 public - 注意:该接口由 Spring 自 2003 年起提供,稳定可靠,但会让业务类强依赖 Spring 框架
- 示例中常见操作包括:调用
executor.shutdown()+awaitTermination()、关闭数据库连接、释放文件句柄等
@PreDestroy 注解:JSR-250 标准的通用方案
@PreDestroy 是 Java EE 规范定义的标准注解(现属 Jakarta EE),Spring 兼容支持。它标记的方法会在 Bean 销毁前执行。
- 无需实现接口,不引入 Spring 依赖,更适合解耦或跨框架迁移的项目
- 一个类可标注多个 @PreDestroy 方法,容器按声明顺序调用
- 方法不能有参数、不能是 static、返回类型必须为 void,访问修饰符任意(推荐 public 或 protected)
- 注意:需确保启用了注解处理,如使用
@Configuration类时,@EnableAnnotationDriven已默认生效;XML 配置需启用context:annotation-config
执行顺序与协作建议
当一个 Bean 同时用了 @PreDestroy 和实现了 DisposableBean,Spring 的实际调用顺序是:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先执行所有 @PreDestroy 方法
- 再调用 DisposableBean.destroy()
- 最后才真正从容器中移除 Bean 实例
这种设计允许你分层清理:@PreDestroy 做轻量预处理(如标记状态、拒绝新请求),DisposableBean 做阻塞式收尾(如等待任务完成、关闭底层连接)。电商订单服务中常这样组合使用。
替代与增强方式
除了上述两种,还有几种等效或补充手段:
- @Bean(destroyMethod = "close"):适合已有 close() 方法的第三方类(如 HikariDataSource),无需改源码
- 实现 AutoCloseable 接口:Spring 会自动识别并调用 close(),语义清晰,且兼容 try-with-resources
- SmartLifecycle.stop():适用于需要控制启动/停止顺序、或异步关闭的高级场景
不复杂但容易忽略的是:所有这些机制都只在容器正常关闭(如调用 context.close() 或接收 SIGTERM)时生效。暴力 kill 进程或未显式关闭上下文,清理逻辑不会运行。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










