spring DisposableBean作用,在spring Bean销毁时的钩子 以及@PreDestroy

DisposableBean 作用

在Spring框架中,DisposableBean是一个接口,它定义了一个单一的方法,用于在Spring容器关闭时或一个由Spring管理的Bean不再需要时执行特定的清理操作。当一个Bean实现了DisposableBean接口,Spring容器会在销毁该Bean之前调用其destroy()方法。这样设计的主要目的是为了确保那些在Bean生命周期内分配的系统资源能够得到适当的释放,避免内存泄漏或其他类型的资源浪费。

以下是DisposableBean接口的基本定义:
在这里插入图片描述

作用与应用场景:

资源释放
当Bean实例化后可能打开了数据库连接、文件句柄、网络套接字、注册了监听器等资源。在应用关闭或Bean不再需要时,通过实现DisposableBean并提供destroy()方法的实现,可以确保这些资源在Bean销毁时被正确关闭或注销,防止资源泄露。

清理工作
Bean可能在运行过程中创建了临时文件、注册了定时任务、启动了后台线程等,需要在Bean生命周期结束时进行清理。destroy()方法提供了一个统一的钩子,使得开发者可以在其中编写必要的清理逻辑。

优雅停机
在Web应用服务器关闭、Spring上下文刷新或应用程序正常退出时,Spring容器会按照一定的顺序销毁Bean。实现DisposableBean的Bean将按照依赖关系逆序被销毁,确保依赖Bean先于依赖它的Bean释放资源,有助于实现系统的优雅停机。
替代方式与配合使用:

除了实现DisposableBean接口外,还有其他方式可以指定Bean的销毁回调方法

XML配置中的<bean>标签的destroy-method属性:
在Spring的XML配置文件中,可以直接为某个元素指定一个destroy-method属性,其值为Bean类中需要在销毁时调用的方法名。例如:

<bean id="myBean" class="com.example.MyBean" destroy-method="cleanup"/>

这里,MyBean类中应有一个名为cleanup的无参公有方法,该方法将在Bean销毁时被Spring容器调用。

使用 @PreDestroy 注解:
对于使用Java配置或基于注解的Bean管理,可以使用JSR-250规范中的@PreDestroy注解来标记一个方法作为销毁回调。该方法将在Bean销毁时由Spring的CommonAnnotationBeanPostProcessor自动调用:

import javax.annotation.PreDestroy;public class MyBean {// ...@PreDestroypublic void shutdown() {// 清理逻辑}
}

DisposableBean接口在Spring框架中用于定义Bean的销毁逻辑,允许开发者在Bean生命周期结束时执行必要的资源释放、清理工作,以保证应用程序的健壮性和系统资源的有效管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows创建类似Linux软连接、Windows软连接、快捷方式

Windows创建软连接 mklink 在 Windows 系统上&#xff0c;可以使用 mklink 命令来创建类似 Linux 的软连接&#xff0c;也称为符号链接。软连接是一种指向另一个文件或目录的链接&#xff0c;它允许您使用不同的名称来访问相同的文件或目录。与快捷方式不同&#xff0c;软连接…

Integer缓存池知道吗?

因为根据实践发现大部分的数据操作都集中在值比较小的范围&#xff0c;因此Integer搞了个缓存池&#xff0c;默认范围是-128到127&#xff0c;可以根据通过设置JVM-XX: AutoBoxCacheMax <size>来修改缓存的最大值&#xff0c;最小值改不了。 实现的原理是int在自动装箱…

IntelliJ IDEA - 10 款 IDEA 宝贝插件,YYDS!

好久没发这种实用贴了&#xff0c;最近用到了一些能提升工作效率的IDEA插件&#xff0c;给小伙伴们分享一下。相信我&#xff0c;我分享的这些插件&#xff0c;都是实实在在能解决实际开发场景中痛处的。 1、POJO to JSON 开发工作中&#xff0c;常常在设计完API后&#xff0c…

【每日算法】理论:深度学习基础 刷题:栈与队列的转换

上期文章 【每日算法】理论&#xff1a;深度学习基础 刷题&#xff1a;KMP算法思想 文章目录 上期文章一、上期问题二、本期理论问题1、RAW图像和RGB图像的区别&#xff1f;2、LSTM模型3、卷积层和池化层有什么区别4、tokenizer 的分词方法有那些&#xff1f;5、10亿个参数的模…

FPGA实现AXI4总线的读写_如何写axi4逻辑

FPGA实现AXI4总线的读写_如何写axi4逻辑 一、AXI4 接口描述 通道信号源信号描述全局信号aclk主机全局时钟aresetn主机全局复位&#xff0c;低有效写通道地址与控制信号通道M_AXI_WR_awid[3:0]主机写地址ID&#xff0c;用来标志一组写信号M_AXI_WR_awaddr[31:0]主机写地址&…

Nest.js项目初始配置

1.全局安装nest pnpm add -g nestjs/cli nodemon ts-node 2.创建nest项目 nest new project-name 3.安装依赖 pnpm add prisma-binding ts-node prisma/client mockjs nestjs/config class-validator class-transformer argon2 nestjs/passport passport passport-local n…

如何一键清除文件目录下所有的node_modules

如何一键清除文件目录下所有的node_modules 快速删除目录下的node_modules&#xff0c;下面附上windows和mac的脚本指令 windows脚本 FOR /d /r . %d in (node_modules) DO IF EXIST "%d" rm -rf "%d"mac脚本 find . -name "node_modules" -…

最短路问题之Bellman-Ford,SPFA算法,例题 负环

Bellman-Ford算法&#xff1a; Bellman-Ford算法用于解决带有负权边的单源最短路径问题。其基本思想是通过不断地松弛边来逐步求解最短路径。算法的主要步骤如下&#xff1a; 初始化&#xff1a;将源点到各个顶点的距离初始化为无穷大&#xff0c;源点的距离初始化为0。重复更…

JavaScript 变量 及 案例练习

变量 一. 变量是什么: 问题1: 用户输入的数据我们如何存储起来? 答案1: 使用变量 理解变量是如何存储数据的 “容器” **变量: ** 白话: 变量就是一个装东西的盒子通俗: 变量是计算机中用来存储数据的 “容器” , 它可以让计算机变得有记忆注意: 变量不是数据本身, 它们仅…

IDEA2023版本创建Sping项目无法使用Java8

1. 问题复现 1.1 当前版本2023.3.2 1.2 创建项目时&#xff1a;不存在jdk8选项 提示报错 1.3 原因分析 Spring官方发布Spring Boot 3.0.0 的时候告知了一些情况&#xff0c;Java 17将成为未来的主流版本 2. 如何解决 2.1 替换创建项目的源 我们只知道IDEA页面创建Spring项目…

对Java未来的发展趋势和新技术的看法

Java作为一种广泛使用的编程语言&#xff0c;已经走过了数十年的历程&#xff0c;其在企业级应用开发、大数据处理、云计算等多个领域都发挥着重要作用。随着技术的不断进步&#xff0c;Java也在不断发展&#xff0c;呈现出一些新的趋势和新技术。以下是对Java未来发展趋势和新…

Mysql 的char 和varchar的的区别

1、char 和varchar 区别 下面以utf8字符集为例&#xff0c;char和varchar的占比计算&#xff0c;如下图 valueChar(5)bytesVarchar(5)bytesVarchar(100&#xff09;bytes‘’‘ ’15‘’1‘’1‘abcd’‘abcd ’15‘abcd’13‘abcd’13abcdeabcde15abcde16abcde16 varchar使用…

【PHP快速上手(十四)】

目录 PHP快速上手&#xff08;十四&#xff09;PHP 中常用数据库操作使用 WHERE 子句进行条件查询使用 ORDER BY 子句进行排序使用 UPDATE 语句更新数据使用 DELETE 语句删除数据执行事务总结 PHP快速上手&#xff08;十四&#xff09; PHP 中常用数据库操作 当使用 PHP 中的…

NumPy 1.26 中文文档翻译完成

NumPy 1.26 中文文档NumPy 用户指南开始入门什么是 NumPy&#xff1f;NumPy 快速开始NumPy: 绝对初学者的基础知识基础与用法NumPy 基础知识MATLAB 用户的 NumPyNumPy 特性NumPy 如何操作高级用法和互操作性从源码编译使用 NumPy C-APIF2PY 用户指南和参考手册开发人员的底层文…

kubernetes中的静态POD

我们都知道&#xff0c;pod是kubelet创建的&#xff0c;那么创建的流程是什么呐&#xff1f; 此时我们需要了解k8s中config.yaml配置文件了&#xff1a; 他的存放路径&#xff1a; 【/var/lib/kubelet/config.yaml】 一、查看静态pod的路径 [K8Sk8s-master ~]$ sudo cat /va…

前端中的promise.all()的使用

理解和使用Promise.all和Promise.race 一、promise.all的使用 说明 Promise.all 可以将多个Promise实例包装成一个新的Promise实例&#xff0c;等待所有都完成&#xff08;或第一个失败&#xff09;返回值 成功的时候返回的是一个数组&#xff0c;失败的时候则返回先被…

Linux驱动开发——(五)内核中断

目录 一、内核中断简介 1.1 中断号 1.2 中断API函数 1.2.1 irq_of_parse_and_map函数 1.2.2 gpio_to_irq函数 1.2.3 request_irq函数 1.2.4 free_irq函数 1.2.5 中断处理函数 1.2.6 中断使能与禁止函数 二、上半部&#xff08;顶半部&#xff09;与下半部&#xff08…

代码托管基础操作

在待上传代码文件夹中右键&#xff0c;打开Git Bash Here依次输入以下命令&#xff1a; git init(在本地初始化一个代码仓库&#xff0c;具体表现为会在你的文件夹里出现一个隐藏的.git文件夹) git add .&#xff08;先把代码放到本地的一个缓冲区&#xff09;添加当前目录下的…

【C++】从零开始认识泛型编程 — 模版

送给大家一句话&#xff1a; 尽管眼下十分艰难&#xff0c;可日后这段经历说不定就会开花结果。总有一天我们都会成为别人的回忆&#xff0c;所以尽力让它美好吧。 – 岩井俊二 &#xff3c;&#xff3c;\ ⱶ˝୧(๑ ⁼̴̀ᐜ⁼̴́๑)૭兯 //&#xff0f;&#xff0f; &#…

六、Java+FFmpeg,实战直播推流

目录 类 JavaFFmepegTest run() 方法 openFFmpegExe() 方法 main() 方法 总结 import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io