知識庫 / Spring RSS 訂閱

Spring 銷燬回調

Spring
HongKong
4
02:00 PM · Dec 06 ,2025

1. 概述

在本教程中,我們將學習使用 shutdown 回調與 Spring 的不同方法。

使用 shutdown 回調的主要優勢在於,它使我們能夠對應用程序的優雅退出獲得控制。

2. 銷燬回調方法Spring 支持組件級別的和上下文級別的銷燬回調。我們可以使用以下方法創建這些回調:

@PreDestroyDisposableBean 接口Bean-destroy 方法全局 ServletContextListener

下面我們將通過示例展示這些方法。

2.1. 使用 @PreDestroy

讓我們創建一個使用 @PreDestroy 的 Bean:

@Component
public class Bean1 {

    @PreDestroy
    public void destroy() {
        System.out.println(
          "Callback triggered - @PreDestroy.");
    }
}

在 Bean 初始化期間,Spring 會註冊所有標記了 @PreDestroy 註解的 Bean 方法,並在應用程序關閉時調用它們。

2.2. 使用 <emDisposableBean 接口

我們的第二個 Bean 將實現 <emDisposableBean 接口,以註冊 shutdown 回調:

@Component
public class Bean2 implements DisposableBean {

    @Override
    public void destroy() throws Exception {
        System.out.println(
          "Callback triggered - DisposableBean.");
    }
}

2.3. 聲明 Bean 銷燬方法

對於這種方法,首先我們將創建一個包含自定義銷燬方法的類:

public class Bean3 {

    public void destroy() {
        System.out.println(
          "Callback triggered - bean destroy method.");
    }
}

然後,我們創建配置類,該類初始化 Bean 並將其 destroy() 方法標記為我們的銷燬回調:

@Configuration
public class ShutdownHookConfiguration {

    @Bean(destroyMethod = "destroy")
    public Bean3 initializeBean3() {
        return new Bean3();
    }
}

註冊銷燬方法的 XML 方式是:

<bean class="com.baeldung.shutdownhooks.config.Bean3"
  destroy-method="destroy">

2.4. 使用全局 ServletContextListener

與前三種方法不同,ServletContextListener 在 bean 級別註冊回調,它在上下文級別註冊回調。

為了實現這一點,我們創建一個自定義上下文監聽器:

public class ExampleServletContextListener
  implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        System.out.println(
          "Callback triggered - ContextListener.");
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // Triggers when context initializes
    }
}

我們需要將其註冊到配置類中的 ServletListenerRegistrationBean 中:

@Bean
ServletListenerRegistrationBean<ServletContextListener> servletListener() {
    ServletListenerRegistrationBean<ServletContextListener> srb
      = new ServletListenerRegistrationBean<>();
    srb.setListener(new ExampleServletContextListener());
    return srb;
}

3. 結論

我們學習了 Spring 提供在不同級別註冊 shutdown 回調的方式,包括在 Bean 級別和 Context 級別。

這些回調可用於以優雅且有效的方式關閉應用程序,並釋放已使用的資源。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.