在Spring中,实现DisposableBean接口或使用@PreDestroy注解可让Bean在销毁时执行清理逻辑;前者需重写destroy()方法,后者更轻量解耦,均要求Bean由Spring容器管理且作用域为singleton。

在 Spring 中,让 Bean 在销毁时执行清理逻辑,实现 DisposableBean 接口是最直接的方式之一。它要求你重写 destroy() 方法,Spring 容器关闭前会自动调用该方法。
1. 实现 DisposableBean 接口
你的 Bean 类只需实现 org.springframework.beans.factory.DisposableBean 接口,并覆盖 destroy() 方法:
示例代码:
import org.springframework.beans.factory.DisposableBean;
public class MyService implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("MyService 正在被销毁,释放资源...");
// 关闭连接、清空缓存、注销监听器等
}
}
2. 配合初始化逻辑(可选但推荐)
通常销毁逻辑与初始化逻辑成对出现。你可以同时实现 InitializingBean,或使用 @PostConstruct 和 @PreDestroy 注解,更灵活清晰:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 若用接口方式:同时实现
InitializingBean,重写afterPropertiesSet() - 若用注解方式(推荐):
@PostConstruct标记初始化方法,@PreDestroy标记销毁方法,无需实现接口
3. 确保 Bean 被 Spring 容器管理
DisposableBean 只在 Spring 容器主动销毁单例 Bean 时触发(如调用 context.close() 或应用正常关闭)。注意以下几点:
- 必须是 Spring 管理的 Bean(通过
@Component、@Service或 XML/JavaConfig 注册) - 默认作用域为
singleton;prototype Bean 不会触发destroy() - 使用
@PreDestroy时需确保启用了 JSR-250 支持(Spring 默认已支持)
4. 替代方案:@PreDestroy 注解(更现代)
相比接口方式,注解更轻量、解耦性更好:
import javax.annotation.PreDestroy;
@Component
public class MyService {
@PreDestroy
public void cleanup() {
System.out.println("MyService 清理完成");
}
}
只要类被 Spring 托管且容器正常关闭,该方法就会执行。

















