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

news2024/9/22 7:20:35

文章目录

      • 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/beans
           http://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;
    }

    @Override
    public 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/beans
           http://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.coloradmin.cn/o/1316313.html

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

相关文章

Mybatis-Spring整合原理:MapperFactoryBean和MapperScannerConfigurer的区别及源码剖析

文章目录 引言MapperFactoryBean的用法和优缺点MapperScannerConfigurer的用法和优缺点MapperFactoryBean源码分析MapperScannerConfigurer源码分析Spring容器初始化流程回顾核心方法&#xff1a;postProcessBeanDefinitionRegistryBeanDefinitionRegistryPostProcessor和BeanF…

杰理-音箱-flash配置

杰理-音箱-flash配置 注意配置io&#xff0c;双线或者4线的硬件连接方式&#xff0c;否则无法烧录UI资源

STM32与Freertos入门(七)信号量

1、简介 FreeRTOS提供了二值信号&#xff08;Binary Semaphore&#xff09;作为一种同步机制&#xff0c;用于在任务之间进行简单的通信和同步操作。二值信号是一种特殊类型的信号量&#xff0c;只能有两种状态&#xff1a;0&#xff08;未触发&#xff09;和1&#xff08;已触…

PAT 乙级 1019 数字黑洞

解法思路,我用c语言和python 做了这道题&#xff0c;这里面有一个小坑就是没说一定是4位整数&#xff0c;有可能是3位&#xff0c;2,1&#xff0c;位&#xff0c;用python排序时候需要注意&#xff0c;我c语言用的hash反而无所谓。。代码如下&#xff1a; c语言代码: #includ…

CTFHub | 反射型

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

腾讯云服务器优惠活动大全页面_全站搜优惠合集

腾讯云推出优惠全站搜页面 https://curl.qcloud.com/PPrF9NFe 在这个页面可以一键查询所需云服务器、轻量应用服务器、数据库、存储、CDN、网络、安全、大数据等云产品优惠活动大全&#xff0c;活动打开如下图&#xff1a; 腾讯云优惠全站搜 腾讯云优惠全站搜页面 txybk.com/go…

STP笔记总结

STP --- 生成树协议 STP&#xff08;Spanning Tree Protocol&#xff0c;生成树协议&#xff09;是根据 IEEE802.1D标准建立的&#xff0c;用于在局域网中消除数据链路层环路的协议。运行STP协议的设备通过彼此交互信息发现网络中的环路&#xff0c;并有选择地对某些端口进行阻…

MyBatis原理解读

我们项目中多用MyBatis进行数据库的读写,开源的MyBatis-Plus框架对其进行了增强,使用上更加简单,我们之前的很多项目也是直接用的MyBatis-Plus。 数据库操作的时候,简单的单表读写,我们可以直接在方法里链式组装SQL,复杂的SQL或涉及多表联合join的,需要在xml手写SQL语句…

缓存的定义及重要知识点

文章目录 缓存的意义缓存的定义缓存原理缓存的基本思想缓存的优势缓存的代价 缓存的重要知识点 缓存的意义 在互联网高访问量的前提下&#xff0c;缓存的使用&#xff0c;是提升系统性能、改善用户体验的唯一解决之道。 缓存的定义 缓存最初的含义&#xff0c;是指用于加速 …

Python导入模块,Python import用法(超级详细)

对于一个真实的 Python 程序&#xff0c;我们不可能自己完成所有的工作&#xff0c;通常都需要借助于第三方类库。此外&#xff0c;也不可能在一个源文件中编写整个程序的源代码&#xff0c;这些都需要以模块化的方式来组织项目的源代码。 使用 import 导入模块的语法&#xf…

解决:TypeError: write() argument must be str, not tuple

解决&#xff1a;TypeError: write() argument must be str, not tuple 文章目录 解决&#xff1a;TypeError: write() argument must be str, not tuple背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&#xff0c;报错&…

提供一个数据库的表,然后,分页显示表中所有信息,一页10个,此表130条信息。最后再以饼图显示男 女 未知 人数的情况。

运行之后显示的效果&#xff1a; 如果是新项目&#xff0c;建立项目后&#xff0c;把mysql驱动放到指定的目录下即&#xff1a; WebContent\WEB-INF-lib 我用的驱动是 mysql-connector-j-8.0.33.jar 展示页 listpage.jsp <%page import"java.util.Map.Entry"%&g…

DIY电脑装机机箱风扇安装方法

作为第一次自己diy一台电脑主机的我&#xff0c;在经历了众多的坑中今天来说一下如何安装机箱风扇的问题 一、风扇的数量 1、i3 xx50显卡 就用一个cpu散热风扇即可 2、i5 xx60 一个cpu散热风扇 一个风扇即可 3、i7 xx70 一个cpu散热 4个风扇即可 4、i9 xx80 就需要7个以…

设计模式详解---策略模式

1. 策略模式简介 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在运行时根据不同的情境选择不同的算法或策略。该模式将算法封装成独立的类&#xff0c;使得它们可以相互替换&#xff0c;而且可以独立于客户端使用它们的方式。 1.1.…

拷贝的艺术:深拷贝与浅拷贝的区别与应用(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

轻量封装WebGPU渲染系统示例<50>- Json数据描述材质等场景信息

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/DataDrivenScene2.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: json场景数据: {"renderer": {"mtplE…

设计模式——组合模式(结构型)

引言 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们。 问题 如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如&#xff0c; 你有两类对象&#xff1a; ​…

搞懂这6 个持续集成工具,领先80%测试人

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

太空旅行:计算机技术的崭新航程

太空旅行&#xff1a;计算机技术的崭新航程 一、引言 自古以来&#xff0c;人类就对浩渺的宇宙充满了无尽的好奇和渴望。随着科技的飞速发展&#xff0c;太空旅行已经从科幻小说中的构想变为现实。在这个过程中&#xff0c;计算机技术起到了不可或缺的作用。从阿波罗时代的初…

12V升18V4A同步升压恒压WT3210

12V升18V4A同步升压恒压WT3210 WT3210 是一款高功率密度的全集成同步升压转换器&#xff0c;内部集成的功率MOSFET管导通电阻为上管8mΩ和下管15mΩ。可为便携式系统提供空间小尺寸 解决方案。WT3210具有 2.7V 至 20V 的宽输入电压范围&#xff0c;应用在单节或两节锂电池的便携…