Spring Boot應(yīng)用事件監(jiān)聽示例詳解
前言
本文主要給大家介紹了關(guān)于Spring Boot應(yīng)用事件監(jiān)聽的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧
1. Spring Boot特有的應(yīng)用事件
除了Spring框架的事件,Spring Boot的SpringApplication也發(fā)送了一些自己的事件:
- ApplicationStartingEvent:在任何處理(除了注冊listener和initializer)開始之前發(fā)送。
- ApplicationEnvironmentPreparedEvent: 在context創(chuàng)建之前,而用到context中的Environment已經(jīng)被識別時發(fā)送。
- ApplicationContextInitializedEvent: SpringApplication正在啟動,ApplicationContext已準(zhǔn)備好且ApplicationContextInitializer已被調(diào)用但是bean的定義還沒有被加載時發(fā)送。
- ApplicationPreparedEvent: 在context刷新之前,在bean的定義已經(jīng)被加載之后調(diào)用。
- ApplicationStartedEvent: 在任何應(yīng)用和command-line runner調(diào)用之前,而context已經(jīng)被刷新時發(fā)送。
- ApplicationReadyEvent: 在任何應(yīng)用和command-line runner被調(diào)用的時候發(fā)送,它意味著應(yīng)用可以接受請求了。
- ApplicationFailedEvent: 在啟動時有異常的時候發(fā)送。
有些事件是在ApplicationContext創(chuàng)建之前觸發(fā)的,所以我們不能用常規(guī)的注冊成bean的事件監(jiān)聽方式:
- 注解了@EventListener注解分方法的類注冊的bean;
- 實現(xiàn)了ApplicationListener<Event>接口的類注冊的bean。
像ApplicationStartedEvent和ApplicationReadyEvent是ApplicationContext創(chuàng)建之后觸發(fā)的,可以用上述兩種方式來監(jiān)聽事件。
2. 如何監(jiān)聽這些事件
我們可以通過下面的方式注冊監(jiān)聽:
2.1. SpringApplication.addListeners(...)
SpringApplication application = new SpringApplication(StartEventsApplication.class);
application.addListeners(
(ApplicationListener<ApplicationStartingEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName()),
(ApplicationListener<ApplicationEnvironmentPreparedEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName()),
(ApplicationListener<ApplicationContextInitializedEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName()),
(ApplicationListener<ApplicationPreparedEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName()),
(ApplicationListener<ApplicationStartedEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName()),
(ApplicationListener<ApplicationReadyEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName())
);
application.run(args);
2.2. SpringApplicationBuilder.listeners(...)
new SpringApplicationBuilder()
.sources(StartEventsApplication.class)
.listeners(
(ApplicationListener<ApplicationStartingEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName()),
(ApplicationListener<ApplicationEnvironmentPreparedEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName()),
(ApplicationListener<ApplicationContextInitializedEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName()),
(ApplicationListener<ApplicationPreparedEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName()),
(ApplicationListener<ApplicationStartedEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName()),
(ApplicationListener<ApplicationReadyEvent>) event -> log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName())
)
.run(args);
2.3. META-INF/spring.factories
src/main/resources/META-INF/spring.factories:
org.springframework.context.ApplicationListener=top.wisely.startevents.listeners.ApplicationContextInitializedEventListener, \
top.wisely.startevents.listeners.ApplicationEnvironmentPreparedEventListener, \
top.wisely.startevents.listeners.ApplicationPreparedEventListener, \
top.wisely.startevents.listeners.ApplicationReadyEventListener, \
top.wisely.startevents.listeners.ApplicationStartedEventListener, \
top.wisely.startevents.listeners.ApplicationStartingEventListener
監(jiān)聽器只需實現(xiàn)ApplicationListener<要監(jiān)聽的接口類型>接口,無需手動注冊為bean:
public class ApplicationStartedEventListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
log.info("----------- 監(jiān)聽Spring Boot:" + event.getClass().getSimpleName());
}
}
3. 源碼地址
https://github.com/wiselyman/spring-boot-application-events.git (本地下載)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
java中字符進(jìn)行全角半角轉(zhuǎn)換示例代碼
全角:指一個字符占用兩個標(biāo)準(zhǔn)字符位置,而半角:指一字符占用一個標(biāo)準(zhǔn)的字符位置,在日常開發(fā)中經(jīng)常會遇到全角半角轉(zhuǎn)換的要求,下面這篇文章主要給大家介紹了關(guān)于java中字符進(jìn)行全角半角轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-08-08
maven package后Idea項目中找不到target文件的解決
在Idea中執(zhí)行mavenpackage打包后,target文件不顯示,點擊「ShowinExplore」可以在本地文件夾中查到,解決方法:在Idea的Maven工具窗口中,右鍵點擊項目,選擇Reimport,刷新項目即可2024-11-11
SpringBoot項目啟動報錯:命令行太長解決的兩種解決方法
SpringBoot項目啟動時可能會遇到命令行太長的錯誤,本文介紹兩種解決方法修改.idea\workspace.xml文件和執(zhí)行maven的clean命令或重啟IDEA,這些操作可以有效解決啟動問題,需要的朋友可以參考下2024-10-10
一文徹底吃透SpringMVC中的轉(zhuǎn)發(fā)和重定向
大家應(yīng)該都知道springmvc本來就會把返回的字符串作為視圖名解析,然后轉(zhuǎn)發(fā)到對應(yīng)的視圖,這篇文章主要給大家介紹了關(guān)于SpringMVC中轉(zhuǎn)發(fā)和重定向的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
java的三種隨機(jī)數(shù)生成方式的實現(xiàn)方法
這篇文章主要介紹了java的三種隨機(jī)數(shù)生成方式的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

