Перейти к основному содержимому

Обратные вызовы весеннего завершения работы

· 3 мин. чтения

1. Обзор

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

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

2. Подходы обратного вызова отключения

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

  • @PreDestroy
  • `Интерфейс DisposableBean`
  • Метод уничтожения бобов
  • Глобальный прослушиватель контекста сервлета

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

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

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

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

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

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

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

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