Spring 中的disposableBean介绍

在 Spring 框架中,DisposableBean 是一个接口,用于定义 Bean 在被销毁前需要执行的清理逻辑。它是 Spring 容器生命周期回调机制的一部分。


🌱 什么是 DisposableBean

DisposableBean 接口是 Spring 提供的一个标准接口,用于通知容器:该 Bean 在销毁之前需要做一些资源释放或清理工作(如关闭连接、释放文件句柄等)。

接口定义:

java 复制代码
public interface DisposableBean {
    void destroy() throws Exception;
}

当 Spring 容器关闭并销毁该 Bean 时,会自动调用它的 destroy() 方法。


✅ 使用场景

适用于以下情况:

  • 需要手动关闭数据库连接池。
  • 需要关闭网络连接(如 Socket 连接)。
  • 清理临时文件。
  • 关闭线程池或其他后台任务。

🔧 示例代码

1. 实现 DisposableBean 接口

java 复制代码
import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;

@Component
public class MyResource implements DisposableBean {

    public MyResource() {
        System.out.println("MyResource 初始化");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("MyResource 正在销毁,释放资源...");
    }
}

当你关闭 Spring 容器时(例如调用 context.close()),输出如下:

java 复制代码
MyResource 初始化
...
MyResource 正在销毁,释放资源...

⚙️ 其他方式实现 Bean 销毁方法

除了实现 DisposableBean 接口外,Spring 还提供了其他几种方式来定义 Bean 的销毁方法:

方式 描述
1. 实现 DisposableBean 接口 标准 Spring 接口,推荐用于 Spring 项目内部使用
2. 自定义 destroy-method XML 或注解配置中指定一个方法作为销毁方法
3. 使用 @PreDestroy 注解 Java EE 提供的标准注解(JSR-250),可用于任意支持该规范的容器

示例对比:

✅ 方式一:自定义 destroy-method
java 复制代码
public class MyResource {
    public void customDestroy() {
        System.out.println("自定义销毁方法");
    }
}

XML 配置:

XML 复制代码
<bean id="myResource" class="com.example.MyResource" destroy-method="customDestroy"/>

或者使用 @Bean 注解:

java 复制代码
@Bean(destroyMethod = "customDestroy")
public MyResource myResource() {
    return new MyResource();
}
✅ 方式二:使用 @PreDestroy
java 复制代码
import javax.annotation.PreDestroy;

public class MyResource {

    @PreDestroy
    public 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
  • 尽量避免多个销毁方法混用,保持清晰简洁。
相关推荐
猫猫不是喵喵.1 分钟前
Java开发高频面试题汇总(通俗易懂版)
java·开发语言·java高频面试
我命由我1234511 分钟前
Android 设备的日志缓冲区被写满,logcat: Unexpected EOF!
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
xcl092517 分钟前
分销返利商城系统开发实战:返利算法与架构设计指南
java·spring boot
171320330计算机毕设编程21 分钟前
2027计算机毕设五大方向对比&选题推荐
java·ide·python·算法·django·php·推荐算法
171320330计算机毕设编程22 分钟前
基于SpringBoot的在线拍卖系统
android·java·spring boot·小程序·课程设计
未秃头的程序猿27 分钟前
一次秒杀把服务打挂了,我用Sentinel规则配置化救了回来
java·后端·spring cloud
Zane199429 分钟前
明明没删字段,反序列化却报错:都是隐式 serialVersionUID 惹的祸
java·后端
0xBADCODE32 分钟前
动态DEX加载+反射+DES硬编码密钥:安卓三层逆向实战
android·java·python·安全·网络安全·逆向·ctf
被摘下的星星36 分钟前
Java 中 .length、.length() 以及 .size() 的区分
java·开发语言
代码不停41 分钟前
子数组问题
java·算法