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 .