当前位置: 首页 > news >正文

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-methodXML 或注解配置中指定一个方法作为销毁方法
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 标准注解,因此具有更好的可移植性。


📦 总结对比

方法来源是否推荐说明
DisposableBeanSpring 接口✅ 推荐Spring 专用,适合与 Spring 强耦合项目
destroy-methodXML/Java Config✅ 推荐灵活,不侵入业务类
@PreDestroyJava EE (JSR-250)✅ 强烈推荐不依赖 Spring,适用于多框架通用

🚫 注意事项

  • 如果你同时实现了 DisposableBean 并设置了 destroy-method,Spring 会先调用 destroy() 方法,再调用自定义的 destroy-method
  • 对于原型(prototype)作用域的 Bean,Spring 不会自动调用销毁方法,需要你自己管理生命周期。

✅ 最佳实践建议

  • 推荐优先使用 @PreDestroy,因为它符合 Java 标准,不依赖 Spring 特定接口。
  • 如果项目已经深度依赖 Spring,则可以使用 DisposableBean
  • 尽量避免多个销毁方法混用,保持清晰简洁。
http://www.xdnf.cn/news/874315.html

相关文章:

  • C语言数据结构笔记2:结构体地址的遍历_结构体嵌套
  • Java DLL依赖缺失解决思路和修复过程(Windows版本)
  • JVM 内存结构 详解
  • 【Java】CopyOnWriteArrayList
  • 使用 SseEmitter 实现 Spring Boot 后端的流式传输和前端的数据接收
  • 陈伟霆电视剧《九门》开机 续写传奇热血新篇
  • 【博客X】缤果串口蓝牙网络USB调试助手(总汇)
  • python打卡day44
  • 如何通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式(并进行了训练、推理)
  • SQL 中 IN 和 EXISTS 的区别
  • 局部变量-线程安全
  • 池化层-机器学习
  • 5.Promise,async,await概念(1)
  • 【SpringCloud】Nacos配置中心
  • 【HarmonyOS 5】游戏开发教程
  • 面向文档编程:MoonBit 的创新开发体验
  • 照片按时间自动重命名工具
  • Java异常信息
  • PaddleOCR(1):PaddleOCR介绍
  • 雷达流速仪相关介绍
  • 微信小程序开发一个自定义组件的详细教程
  • Haystack:AI与IoT领域的全能开源框架
  • 996引擎-前端组件:富文本(RichText)
  • 研究探析 | 高速摄像机在一种新型冲击压痕技术及其动态标定方法中的应用
  • unix/linux,sudo,其发展历程详细时间线、由来、历史背景
  • Origin如何仅删除奇数行或偶数行的数据
  • shell脚本总结14:awk命令的使用方法
  • 【力扣链表篇】203.移除链表元素
  • DIC技术助力金属管材全场应变测量:高效解决方案
  • 线程的生命周期与数量设置