Рубрики
Без рубрики

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

Узнайте, как запустить логику перед выключением весной

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы изучим различные способы использования обратных вызовов завершения работы с Spring .

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

2. Подходы К Обратному Вызову Завершения Работы

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

  • @Предопределение
  • DisposableBean интерфейс
  • Способ уничтожения бобов
  • Глобальный ServletContextListener

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

2.1. Использование @PreDestroy

Давайте создадим боб, который использует @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.");
    }
}

Затем мы создаем класс конфигурации, который инициализирует компонент и помечает его метод destroy() как наш обратный вызов завершения работы:

@Configuration
public class ShutdownHookConfiguration {

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

XML – способ регистрации метода уничтожения:

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

В отличие от других трех подходов, которые регистрируют обратный вызов на уровне компонента, | 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 servletListener() {
    ServletListenerRegistrationBean srb
      = new ServletListenerRegistrationBean<>();
    srb.setListener(new ExampleServletContextListener());
    return srb;
}

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

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

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

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