Spring 中的disposableBean介绍
在 Spring 框架中,DisposableBean
是一个接口,用于定义 Bean 在被销毁前需要执行的清理逻辑。它是 Spring 容器生命周期回调机制的一部分。
🌱 什么是 DisposableBean
DisposableBean
接口是 Spring 提供的一个标准接口,用于通知容器:该 Bean 在销毁之前需要做一些资源释放或清理工作(如关闭连接、释放文件句柄等)。
接口定义:
public interface DisposableBean {void destroy() throws Exception;
}
当 Spring 容器关闭并销毁该 Bean 时,会自动调用它的 destroy()
方法。
✅ 使用场景
适用于以下情况:
- 需要手动关闭数据库连接池。
- 需要关闭网络连接(如 Socket 连接)。
- 清理临时文件。
- 关闭线程池或其他后台任务。
🔧 示例代码
1. 实现 DisposableBean
接口
import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;@Component
public class MyResource implements DisposableBean {public MyResource() {System.out.println("MyResource 初始化");}@Overridepublic void destroy() throws Exception {System.out.println("MyResource 正在销毁,释放资源...");}
}
当你关闭 Spring 容器时(例如调用 context.close()
),输出如下:
MyResource 初始化
...
MyResource 正在销毁,释放资源...
⚙️ 其他方式实现 Bean 销毁方法
除了实现 DisposableBean
接口外,Spring 还提供了其他几种方式来定义 Bean 的销毁方法:
方式 | 描述 |
---|---|
1. 实现 DisposableBean 接口 | 标准 Spring 接口,推荐用于 Spring 项目内部使用 |
2. 自定义 destroy-method | XML 或注解配置中指定一个方法作为销毁方法 |
3. 使用 @PreDestroy 注解 | Java EE 提供的标准注解(JSR-250),可用于任意支持该规范的容器 |
示例对比:
✅ 方式一:自定义 destroy-method
public class MyResource {public void customDestroy() {System.out.println("自定义销毁方法");}
}
XML 配置:
<bean id="myResource" class="com.example.MyResource" destroy-method="customDestroy"/>
或者使用 @Bean
注解:
@Bean(destroyMethod = "customDestroy")
public MyResource myResource() {return new MyResource();
}
✅ 方式二:使用 @PreDestroy
import javax.annotation.PreDestroy;public class MyResource {@PreDestroypublic void cleanUp() {System.out.println("使用 @PreDestroy 销毁资源");}
}
注意:
@PreDestroy
和@PostConstruct
属于 Java EE 标准注解,因此具有更好的可移植性。
📦 总结对比
方法 | 来源 | 是否推荐 | 说明 |
---|---|---|---|
DisposableBean | Spring 接口 | ✅ 推荐 | Spring 专用,适合与 Spring 强耦合项目 |
destroy-method | XML/Java Config | ✅ 推荐 | 灵活,不侵入业务类 |
@PreDestroy | Java EE (JSR-250) | ✅ 强烈推荐 | 不依赖 Spring,适用于多框架通用 |
🚫 注意事项
- 如果你同时实现了
DisposableBean
并设置了destroy-method
,Spring 会先调用destroy()
方法,再调用自定义的destroy-method
。 - 对于原型(prototype)作用域的 Bean,Spring 不会自动调用销毁方法,需要你自己管理生命周期。
✅ 最佳实践建议
- 推荐优先使用
@PreDestroy
,因为它符合 Java 标准,不依赖 Spring 特定接口。 - 如果项目已经深度依赖 Spring,则可以使用
DisposableBean
。 - 尽量避免多个销毁方法混用,保持清晰简洁。