Spring Boot: события приложения и слушатели
В дополнение к обычным событиям Spring Framework, таким как ContextRefreshedEvent, SpringApplication отправляет некоторые дополнительные события приложения.
Некоторые события на самом деле инициируются до создания ApplicationContext, поэтому вы не можете зарегистрировать прослушиватель (listener) для них как @Bean. Вы можете зарегистрировать их с помощью метода SpringApplication.addListeners(…) или метода SpringApplicationBuilder.listeners(…).
Если вы хотите, чтобы эти слушатели регистрировались автоматически, независимо от способа создания приложения, вы можете добавить файл META-INF/spring.factories в свой проект и ссылаться на своих слушателей с помощью org.springframework.context. Ключ ApplicationListener, как показано в следующем примере:
org.springframework.context.ApplicationListener=com.example.project.MyListener
События приложения отправляются в следующем порядке по мере запуска приложения:
- ApplicationStartingEvent отправляется в начале выполнения, но перед любой обработкой, за исключением регистрации слушателей и инициализаторов.
- ApplicationEnvironmentPreparedEvent отправляется, когда среда, которая будет использоваться в контексте, известна, но до создания контекста.
- ApplicationContextInitializedEvent отправляется, когда подготовлен ApplicationContext и вызваны ApplicationContextInitializer, но перед загрузкой любых определений компонента (bean).
- ApplicationPreparedEvent отправляется непосредственно перед началом обновления, но после загрузки определений компонента (bean).
- ApplicationStartedEvent отправляется после обновления контекста, но перед вызовом любых приложений и исполнителей командной строки.
- ApplicationReadyEvent отправляется после вызова любых приложений и исполнителей командной строки. Это указывает на то, что приложение готово к обслуживанию запросов.
- ApplicationFailedEvent отправляется, если при запуске возникает исключение.
Приведенный выше список включает только SpringApplicationEvents, которые связаны с SpringApplication. В дополнение к этому следующие события также публикуются после ApplicationPreparedEvent и перед ApplicationStartedEvent:
- ContextRefreshedEvent отправляется при обновлении ApplicationContext.
- WebServerInitializedEvent отправляется после того, как WebServer готов. ServletWebServerInitializedEvent и ReactiveWebServerInitializedEvent являются сервлетом и реактивными вариантами соответственно.
Обычно вам не нужно использовать события приложения, но может быть полезно знать, что они существуют. Внутри Spring Boot использует события для решения самых разных задач.
События приложения отправляются с использованием механизма публикации событий Spring Framework. Часть этого механизма гарантирует, что событие, опубликованное для слушателей в дочернем контексте, также будет опубликовано для слушателей в любых контекстах предков. В результате этого, если ваше приложение использует иерархию экземпляров SpringApplication, слушатель может получить несколько экземпляров одного и того же типа события приложения.
Чтобы позволить вашему слушателю различать событие для его контекста и событие для контекста-потомка, он должен запросить, чтобы его контекст приложения был внедрен, а затем сравнить введенный контекст с контекстом события. Контекст может быть введен путем реализации ApplicationContextAware или, если слушатель является компонентом (bean), с помощью @Autowired.
Читайте также:
- Spring Boot: класс SpringApplication
- Разработка вашего первого Spring Boot приложения
- Spring Boot: ленивая инициализация (Lazy Initialization)
Комментарии
Отправить комментарий