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
  • 尽量避免多个销毁方法混用,保持清晰简洁。
相关推荐
硅的褶皱2 小时前
对比分析LinkedBlockingQueue和SynchronousQueue
java·并发编程
MoFe12 小时前
【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)
java·前端·.netcore
季鸢2 小时前
Java设计模式之观察者模式详解
java·观察者模式·设计模式
Fanxt_Ja2 小时前
【JVM】三色标记法原理
java·开发语言·jvm·算法
萌新小码农‍2 小时前
Spring框架学习day7--SpringWeb学习(概念与搭建配置)
学习·spring·状态模式
Mr Aokey3 小时前
Spring MVC参数绑定终极手册:单&多参/对象/集合/JSON/文件上传精讲
java·后端·spring
小马爱记录4 小时前
sentinel规则持久化
java·spring cloud·sentinel
长勺4 小时前
Spring中@Primary注解的作用与使用
java·后端·spring
紫乾20144 小时前
idea json生成实体类
java·json·intellij-idea
wh_xia_jun4 小时前
在 Spring Boot 中使用 JSP
java·前端·spring boot