Обратные вызовы весеннего отключения

Весенние обратные вызовы

1. обзор

В этом руководстве мы изучим разные способы,to use shutdown callbacks with Spring.

Основным преимуществом использования обратного вызова завершения работы является то, что он дает нам контроль над изящным выходом из приложения.

2. Подходы обратного вызова при завершении работы

Spring поддерживает как обратные вызовы отключения на уровне компонентов, так и на уровне контекста. Мы можем создать эти обратные вызовы, используя:

  • @PreDestroy

  • DisposableBean интерфейс

  • Метод уничтожения бобов

  • ГлобальныйServletContextListener

Давайте посмотрим на все эти подходы на примерах.

2.1. Используя@PreDestroy

Давайте создадим bean-компонент, который использует@PreDestroy:

@Component
public class Bean1 {

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

Во время инициализации компонента Spring зарегистрирует все методы компонента, помеченные@PreDestroy, и вызовет их при завершении работы приложения.

2.2. Использование интерфейсаDisposableBean

Наш второй компонент будет реализовывать интерфейсDisposableBean для регистрации обратного вызова выключения:

@Component
public class Bean2 implements DisposableBean {

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

2.3. Объявление метода уничтожения бина

Для этого подхода сначала мы создадим класс с настраиваемым методом уничтожения:

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 способ регистрации метода уничтожения:

2.4. Использование глобальногоServletContextListener

В отличие от трех других подходов, которые регистрируют обратный вызов на уровне bean-компонента,the ServletContextListener registers the callback at context level.

Для этого давайте создадим собственный прослушиватель контекста:

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 servletListener() {
    ServletListenerRegistrationBean srb
      = new ServletListenerRegistrationBean<>();
    srb.setListener(new ExampleServletContextListener());
    return srb;
}

3. Заключение

Мы узнали о различных способах, которые Spring предоставляет для регистрации обратных вызовов завершения работы как на уровне компонента, так и на уровне контекста.

Их можно использовать для корректного завершения работы приложения и эффективного освобождения используемых ресурсов.

Как всегда все примеры, упомянутые в этой статье, можно найтиover on Github.