您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Spring Boot啟動(dòng)事件和監(jiān)聽(tīng)器的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
Spring Boot 啟動(dòng)事件順序
1、ApplicationStartingEvent
這個(gè)事件在 Spring Boot 應(yīng)用運(yùn)行開(kāi)始時(shí),且進(jìn)行任何處理之前發(fā)送(除了監(jiān)聽(tīng)器和初始化器注冊(cè)之外)。
2、ApplicationEnvironmentPreparedEvent
這個(gè)事件在當(dāng)已知要在上下文中使用 Spring 環(huán)境(Environment)時(shí),在 Spring 上下文(context)創(chuàng)建之前發(fā)送。
3、ApplicationContextInitializedEvent
這個(gè)事件在當(dāng) Spring 應(yīng)用上下文(ApplicationContext)準(zhǔn)備好了,并且應(yīng)用初始化器(ApplicationContextInitializers)已經(jīng)被調(diào)用,在 bean 的定義(bean definitions)被加載之前發(fā)送。
4、ApplicationPreparedEvent
這個(gè)事件是在 Spring 上下文(context)刷新之前,且在 bean 的定義(bean definitions)被加載之后發(fā)送。
5、ApplicationStartedEvent
這個(gè)事件是在 Spring 上下文(context)刷新之后,且在 application/ command-line runners 被調(diào)用之前發(fā)送。
6、AvailabilityChangeEvent
這個(gè)事件緊隨上個(gè)事件之后發(fā)送,狀態(tài):ReadinessState.CORRECT,表示應(yīng)用已處于活動(dòng)狀態(tài)。
7、ApplicationReadyEvent
這個(gè)事件在任何 application/ command-line runners 調(diào)用之后發(fā)送。
8、AvailabilityChangeEvent
這個(gè)事件緊隨上個(gè)事件之后發(fā)送,狀態(tài):ReadinessState.ACCEPTING_TRAFFIC,表示應(yīng)用可以開(kāi)始準(zhǔn)備接收請(qǐng)求了。
9、ApplicationFailedEvent
這個(gè)事件在應(yīng)用啟動(dòng)異常時(shí)進(jìn)行發(fā)送。
上面所介紹的這些事件列表僅包括綁定到 SpringApplication 的 SpringApplicationEvents 事件,除了這些事件以外,以下事件也會(huì)在 ApplicationPreparedEvent 之后和 ApplicationStartedEvent 之前發(fā)送:
WebServerInitializedEvent
這個(gè) Web 服務(wù)器初始化事件在 WebServer 啟動(dòng)之后發(fā)送,對(duì)應(yīng)的還有 ServletWebServerInitializedEvent(Servlet Web 服務(wù)器初始化事件)、ReactiveWebServerInitializedEvent(響應(yīng)式 Web 服務(wù)器初始化事件)。
ContextRefreshedEvent
這個(gè)上下文刷新事件是在 Spring 應(yīng)用上下文(ApplicationContext)刷新之后發(fā)送。
自定義啟動(dòng)事件監(jiān)聽(tīng)器
既然我們知道了 Spring Boot 在啟動(dòng)過(guò)程中的各個(gè)事件,那么我們就可以在每個(gè)環(huán)節(jié)來(lái)處理一些我們想做的事情,只需要自定義一個(gè)監(jiān)聽(tīng)器來(lái)監(jiān)聽(tīng)某個(gè)事件就可以了。
比如我們想在上面的第 8 步,即應(yīng)用啟動(dòng)完成可以接收請(qǐng)求了,我們簡(jiǎn)單輸出一個(gè)成功標(biāo)識(shí)。
1、新建監(jiān)聽(tīng)器
import lombok.extern.slf4j.Slf4j; import org.springframework.boot.availability.AvailabilityChangeEvent; import org.springframework.boot.availability.ReadinessState; import org.springframework.context.ApplicationListener; /** * 來(lái)源微信公眾號(hào):Java技術(shù)棧 */ @Slf4j public class JavastackListener implements ApplicationListener<AvailabilityChangeEvent> { @Override public void onApplicationEvent(AvailabilityChangeEvent event) { log.info("監(jiān)聽(tīng)到事件:" + event); if (ReadinessState.ACCEPTING_TRAFFIC == event.getState()){ log.info("應(yīng)用啟動(dòng)完成,可以請(qǐng)求了……"); } } }
新建一個(gè)自定義監(jiān)聽(tīng)器,實(shí)現(xiàn)了 ApplicationListener 接口,泛型 AvailabilityChangeEvent 表示僅僅監(jiān)聽(tīng) AvailabilityChangeEvent 事件。
因第 8 步的事件和第 6 步的事件同名,我們可以根據(jù)事件的狀態(tài)來(lái)區(qū)分到底是哪一個(gè)環(huán)節(jié)的事件 。
2、注冊(cè)監(jiān)聽(tīng)器
注冊(cè)監(jiān)聽(tīng)器有兩種方式:
1、在資源目錄中的 META-INF/spring.factories 文件中自動(dòng)注冊(cè):
org.springframework.context.ApplicationListener=\ cn.javastack.springboot.features.listener.JavastackListener
2、如果是監(jiān)聽(tīng) Spring 應(yīng)用上下文(ApplicationContext)創(chuàng)建之后的事件,可以直接在監(jiān)聽(tīng)器上使用 @Component 注解即可,否則需要使用第一種方法的自動(dòng)注冊(cè),因?yàn)?ApplicationContext 并未創(chuàng)建,這時(shí)的 Bean 是不能被加載的。
3、應(yīng)用啟動(dòng)
下面來(lái)看下啟動(dòng)日志:
可以看到同時(shí)輸出了第 6 步和 8 步的監(jiān)聽(tīng)日志,但只輸出第 8 步的啟動(dòng)完成日志,自定義監(jiān)聽(tīng)實(shí)現(xiàn)成功。
關(guān)于“Spring Boot啟動(dòng)事件和監(jiān)聽(tīng)器的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。