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

События контекста приложения Spring

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

1. Введение

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

Чтобы узнать о создании и публикации пользовательских событий, ознакомьтесь с нашим предыдущим руководством здесь.

Spring имеет механизм обработки событий, построенный вокруг ApplicationContext. Его можно использовать для обмена информацией между различными bean-компонентами. Мы можем использовать события приложения, прослушивая события и выполняя собственный код.

Например, сценарий здесь будет заключаться в выполнении пользовательской логики при полном запуске ApplicationContext .

2. Стандартные контекстные события

На самом деле, в Spring есть множество встроенных событий, которые позволяют разработчику подключаться к жизненному циклу приложения и контексту и выполнять некоторые пользовательские операции.

Несмотря на то, что мы редко используем эти события вручную в приложении, фреймворк интенсивно использует их внутри себя. Давайте начнем с изучения различных встроенных событий в Spring.

2.1. ContextRefreshedEvent

При инициализации или обновлении ApplicationContext Spring вызывает ContextRefreshedEvent . Обычно обновление может запускаться несколько раз, пока контекст не был закрыт.

Обратите внимание, что мы также можем запустить событие вручную, вызвав метод refresh() в интерфейсе ConfigurableApplicationContext .

2.2. ContextStartedEvent

Вызывая метод start () в ConfigurableApplicationContext, мы инициируем это событие и запускаем ApplicationContext . На самом деле этот метод обычно используется для перезапуска компонентов после явной остановки. Мы также можем использовать этот метод для работы с компонентами без конфигурации для автозапуска.

Здесь важно отметить, что вызов start() всегда является явным, в отличие от Refresh ().

2.3. ContextStoppedEvent

ContextStoppedEvent публикуется , когда ApplicationContext останавливается путем вызова метода stop() в ConfigurableApplicationContext. Как обсуждалось ранее, мы можем перезапустить остановленное событие, используя метод start() .

2.4. ContextClosedEvent

Это событие публикуется, когда ApplicationContext закрывается с помощью метода close() в ConfigurableApplicationContext .

На самом деле после закрытия контекста мы не можем перезапустить его.

Контекст завершает свою жизнь при его закрытии, и поэтому мы не можем перезапустить его, как в ContextStoppedEvent.

3. @EventListener

Далее давайте рассмотрим, как использовать опубликованные события. Начиная с версии 4.2, Spring поддерживает прослушиватель событий на основе аннотаций — @EventListener.

В частности, мы можем использовать эту аннотацию для автоматической регистрации ApplicationListener на основе подписи метода :

@EventListener
public void handleContextRefreshEvent(ContextStartedEvent ctxStartEvt) {
System.out.println("Context Start Event received.");
}

Примечательно, что @EventListener является основной аннотацией и, следовательно, не требует дополнительной настройки . На самом деле существующий элемент <context:annotation-driven/> обеспечивает его полную поддержку.

Метод, аннотированный @EventListener, может возвращать тип, отличный от void. Если возвращаемое значение не равно нулю, механизм обработки событий опубликует для него новое событие.

3.1. Прослушивание нескольких событий

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

Для такого сценария мы можем использовать атрибут классов :

@EventListener(classes = { ContextStartedEvent.class, ContextStoppedEvent.class })
public void handleMultipleEvents() {
System.out.println("Multi-event listener invoked");
}

4. Слушатель событий приложения

Если мы используем более ранние версии Spring (<4.2), нам придется ввести собственный ApplicationEventListener и переопределить метод onApplicationEvent для прослушивания события.

5. Вывод

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

Как всегда, фрагменты кода, использованные в статье, можно найти на Github .