1. 概要

このチュートリアルでは、Springでシャットダウンコールバックを使用するさまざまな方法を学習します。

シャットダウンコールバックを使用する主な利点は、適切なアプリケーション出口を制御できることです。

2. シャットダウンコールバックアプローチ

Springは、コンポーネントレベルとコンテキストレベルの両方のシャットダウンコールバックをサポートしています。 これらのコールバックは、次を使用して作成できます。

  • @PreDestroy
  • DisposableBeanインターフェース
  • 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. DisposableBeanインターフェイスの使用

2番目のBeanは、 DisposableBean インターフェースを実装して、シャットダウンコールバックを登録します。

@Component
public class Bean2 implements DisposableBean {

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

2.3. BeanDestroyメソッドの宣言

このアプローチでは、最初にカスタムのdestroyメソッドを使用してクラスを作成します。

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();
    }
}

destroyメソッドを登録するXMLの方法は次のとおりです。

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

2.4. グローバルServletContextListenerの使用

Beanレベルでコールバックを登録する他の3つのアプローチとは異なり、ServletContextListenerはコンテキストレベルでコールバックを登録します。

このために、カスタムコンテキストリスナーを作成しましょう。

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. 結論

Beanレベルとコンテキストレベルの両方で、Springがシャットダウンコールバックを登録するために提供するさまざまな方法について学びました。

これらは、アプリケーションを正常にシャットダウンし、使用済みのリソースを効果的に解放するために使用できます。

いつものように、この記事で言及されているすべての例は、Githubにあります。