溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Boot啟動(dòng)事件和監(jiān)聽(tīng)器的示例分析

發(fā)布時(shí)間:2021-12-16 16:52:52 來(lái)源:億速云 閱讀:530 作者:小新 欄目:安全技術(shù)

這篇文章將為大家詳細(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)求了&hellip;&hellip;");         }     }  }

新建一個(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)日志:

Spring Boot啟動(dòng)事件和監(jiān)聽(tī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)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI