【Spring】06 生命周期之销毁回调

文章目录

      • 1. 回调是什么
      • 2. 销毁回调
        • 2.1 实现 DisposableBean 接口
        • 2.2 配置 destroy-method
      • 3. 执行顺序
      • 4. 应用场景
      • 总结

在 Spring 框架中,生命周期回调(Lifecycle Callbacks)是一种强大的机制,它允许我们在 Spring 容器中的 Bean 生命周期的不同阶段执行特定的操作。这为我们提供了一种灵活的方式来管理和控制 Bean 的生命周期。

1. 回调是什么

在 Spring 中,每个 Bean 都有一个生命周期,它从被创建到被销毁的过程中经历了不同的阶段。生命周期回调就是在这些阶段执行特定方法的机制。

Spring 提供了两种生命周期回调的方式:初始化回调和销毁回调。

在这里插入图片描述

发现它是不是有点像模版方法设计模式!

上一节介绍了 初始化回调,本节将继续介绍 销毁回调。

2. 销毁回调

销毁回调是在 Bean 即将被销毁之前执行的方法。Spring 提供了以下两种方式来实现销毁回调:

2.1 实现 DisposableBean 接口

1)配置 Bean

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="springDemo" class="org.example.cheney.SpringDemo"><constructor-arg value="SpringDemo"/></bean>
</beans>

2)创建 Spring 并实现 DisposableBean

package org.example.cheney;import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;@Component
public class SpringDemo implements DisposableBean {private String name;public SpringDemo(String name) {this.name = name;}@Overridepublic void destroy() throws Exception {System.out.println("Bean " + name + "销毁啦(By DisposableBean)");}
}

3)创建启动类

package org.example.cheney;import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {String location = "applicationContext.xml";AbstractApplicationContext appCxt = new ClassPathXmlApplicationContext(location);appCxt.registerShutdownHook();}
}

输出结果:

在这里插入图片描述

2.2 配置 destroy-method

1)配置 Bean

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="springDemo" class="org.example.cheney.SpringDemo" destroy-method="destroyMethod"><constructor-arg value="SpringDemo"/></bean>
</beans>

2)创建 Spring 并创建 destroyMethod()

package org.example.cheney;import org.springframework.stereotype.Component;@Component
public class SpringDemo {private String name;public SpringDemo(String name) {this.name = name;}public void destroyMethod() {System.out.println("Bean " + name + "销毁啦(By destroy-method)");}
}

3)创建启动类

package org.example.cheney;import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {String location = "applicationContext.xml";AbstractApplicationContext appCxt = new ClassPathXmlApplicationContext(location);appCxt.registerShutdownHook();}
}

输出结果:

在这里插入图片描述

3. 执行顺序

销毁回调的执行顺序是:实现 DisposableBean 接口的 destroy 方法 -> 配置 destroy-method。

在这里插入图片描述

4. 应用场景

生命周期回调在实际开发中有着广泛的应用场景,例如:

  • 资源释放和清理: 在销毁回调中,你可以执行资源的释放和清理逻辑,确保在应用程序关闭或 Bean 被销毁时,相关的资源得到正确的处理,比如关闭数据库连接、释放文件句柄等。

  • 与生命周期其他阶段的配合: 销毁回调与 Spring 生命周期的其他阶段(例如 Bean 的初始化阶段)配合使用,使得整个 Bean 的生命周期管理更加完善。你可以确保在 Bean 被销毁之前,执行一些必要的清理操作。

  • 依赖关系的解除: 在销毁回调中,你可以执行一些与依赖关系相关的清理操作,确保在 Bean 被销毁时,相关的依赖关系得到正确的解除,避免内存泄漏或其他问题。

  • 资源回收: 在销毁回调中执行资源的回收逻辑,如释放占用的系统资源、关闭网络连接等,有助于提高应用程序的资源利用效率。

  • 与框架或库的集成: 某些框架或库可能需要在应用程序关闭时进行销毁操作,通过 Spring 的销毁回调,你可以很方便地将这些框架或库的销毁逻辑集成到你的应用程序中。

  • 灵活的配置方式: 你可以选择使用 XML 配置、Java 配置或注解方式来定义销毁回调,根据个人或团队的偏好来进行选择,提供了灵活性。

  • 异常处理: 如果在销毁回调中发生异常,Spring 会捕获并将其转换为 BeanDestructionException,从而阻止应用程序的正常关闭,提高了对销毁过程的安全性

总结

生命周期回调(Lifecycle Callbacks)是 Spring 框架中一个强大的特性,它为开发者提供了在 Bean 的生命周期不同阶段执行特定操作的灵活方式。通过销毁回调,我们能够更好地管理和控制应用程序中的组件。在实际开发中,合理使用生命周期回调可以提高应用程序的稳定性和可维护性。

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

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

相关文章

【PTA刷题+代码+详解】求二叉树度为1的结点个数(递归法)

文章目录 题目C代码详解 题目 在二叉树T中&#xff0c;其度为1的结点是指某结点只有左孩子或只有右孩子。利用递归方法求二叉树T的度为1的结点个数。 1&#xff09;如果TNULL&#xff0c;则是空树&#xff0c;度为1的结点个数为0&#xff0c;返回值为0&#xff1b; 2&#xff0…

我的NPI项目之Android 安全系列 -- 先认识一下ST33Jxxx

目前接触过的高通平台都没有集成单独的SE&#xff0c;安全运行环境都是高通自家的TEE&#xff0c;又言Trustzone。高通Keystore功能也是依赖TEE来实现的。那么&#xff0c;如果另外集成SE&#xff0c;那么高通的Keystore如何集成&#xff1f;TEE部分要如何配置&#xff1f; 最近…

银河麒麟本地软件源配置方法

软件源介绍 软件源可以理解为软件仓库&#xff0c;当需要安装软件时则会根据源配置去相应的软件源下载软件包&#xff0c;此方法的优点是可以自动解决软件包的依赖关系。常见的软件源有光盘源、硬盘源、FTP源、HTTP源&#xff0c;本文档主要介绍本地软件源的配置方法&#xff…

前端框架的虚拟DOM(Virtual DOM)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

智能API代码示例生成工具AiRestful

智能API代码示例生成工具AiRestful 一、产品介绍二、如何使用1、第一步(必须):2、第二步(可选):3、第三步(智能生成): 三、如何集成到您的网站(应用)1、开始接入2、接入案例 四、注意点 一、产品介绍 AiRestful是一款基于智能AI的,帮助小白快速生成任意编程语言的API接口调用示…

[robot_state_publisher-3] Error: Error document empty.

出现这个问题&#xff0c;我这里遇到的是&#xff1a;指定的urdf文件路径无效&#xff0c;而产生这个的根本原因是没有在CMakelists.txt中添加如下代码&#xff1a; install( DIRECTORY urdf DESTINATION share/${PROJECT_NAME} )把urdf文件夹添加到指定的share/${PROJEC…

【Linux】free命令使用

free命令 ​free是指查看当前系统内存的使用情况&#xff0c;它显示系统中剩余及已用的物理内存和交换内存&#xff0c;以及共享内存和被核心使用的缓冲区。 作者 作者&#xff1a;Brian Edmonds。 语法 free [参数] free 命令 -Linux手册页 命令选项及作用 执行令 &am…

beebox靶场A1 low 命令注入通关教程(上)

一&#xff1a;html注入 get HTML注入&#xff0c;就是当用户进行输入时&#xff0c;服务器没有对用户输入的数据进行过滤或转义&#xff0c;导致所有输入均被返回前端&#xff0c;网页解析器会将这些数据当作html代码进行解析,这就导致一些恶意代码会被正常执行。 首先进行简…

YOLOv7 目标检测论文解释和推理

什么是YOLOv7&#xff1f; YOLOv7 是一款单级实时目标检测器。它于 22 年 7 月被引入 YOLO 家族。根据 YOLOv7 的论文&#xff0c;它是迄今为止最快、最准确的实时目标检测器。YOLOv<> 通过提升其性能来建立一个重要的基准。 本文包含简化的 YOLOv7 论文解释和推理测试…

TestSSLServer4.exe工具使用方法简单介绍(查SSL的加密版本SSL3或是TLS1.2)

一、工具使用方法介绍 工具使用方法参照&#xff1a;http://www.bolet.org/TestSSLServer/ 全篇英文看不懂&#xff0c;翻译了下&#xff0c;能用到的简单介绍如下&#xff1a; 将下载的TestSSLServer4.exe工具放到桌面上&#xff0c;CMD命令行进入到桌面目录&#xff0c;执…

oracle 锁表解决办法

相关表介绍 V$LOCKED_OBJECT&#xff08;记录锁信息的表&#xff09;v$session&#xff08;记录会话信息的表&#xff09;v$sql&#xff08;记录 sql 执行的表&#xff09;dba_objects&#xff08;用来管理对象&#xff0c;表、库等等&#xff09; 查询锁表的 SID select b.…

Cypress安装与使用教程(2)—— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…