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 ServletListenerRegistrationBeanservletListener() { ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean<>(); srb.setListener(new ExampleServletContextListener()); return srb; }
3. Заключение
Мы узнали о различных способах, которые Spring предоставляет для регистрации обратных вызовов завершения работы, как на уровне компонентов, так и на уровне контекста.
Они могут быть использованы для изящного завершения работы приложения и эффективного высвобождения используемых ресурсов.
Как всегда, все примеры, упомянутые в этой статье, можно найти на Github .