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

发布时间:2023年12月17日


在 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 的生命周期不同阶段执行特定操作的灵活方式。通过销毁回调,我们能够更好地管理和控制应用程序中的组件。在实际开发中,合理使用生命周期回调可以提高应用程序的稳定性和可维护性。

文章来源:https://blog.csdn.net/yanyc0411/article/details/135027184
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。