<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Boot 啟動(dòng)事件和監(jiān)聽器,太強(qiáng)大了!

          共 3653字,需瀏覽 8分鐘

           ·

          2020-12-16 23:10

          Java技術(shù)棧

          www.javastack.cn

          關(guān)注閱讀更多優(yōu)質(zhì)文章



          大家都知道,在 Spring 框架中事件和監(jiān)聽無處不在,打通了 Spring 框架的任督二脈,事件和監(jiān)聽也是 Spring 框架必學(xué)的核心知識(shí)之一。

          一般來說,我們很少會(huì)使用到應(yīng)用程序事件,但我們也不要忘了它們的存在,比如說在 Spring 框架內(nèi)部都使用了各種不同的事件來處理不同的任務(wù)。

          毫無疑問,在 Spring Boot 框架中,事件和監(jiān)聽也得到了發(fā)揚(yáng)光大,除了常用的 Spring Framework 事件(例如:ContextRefreshedEvent)之外,Spring Boot 在啟動(dòng)過程中還發(fā)送一系列其他的應(yīng)用程序事件。

          Spring Boot 啟動(dòng)事件順序

          1、ApplicationStartingEvent

          這個(gè)事件在 Spring Boot 應(yīng)用運(yùn)行開始時(shí),且進(jìn)行任何處理之前發(fā)送(除了監(jiān)聽器和初始化器注冊(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)用可以開始準(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)聽器

          既然我們知道了 Spring Boot 在啟動(dòng)過程中的各個(gè)事件,那么我們就可以在每個(gè)環(huán)節(jié)來處理一些我們想做的事情,只需要自定義一個(gè)監(jiān)聽器來監(jiān)聽某個(gè)事件就可以了。

          比如我們想在上面的第 8 步,即應(yīng)用啟動(dòng)完成可以接收請(qǐng)求了,我們簡(jiǎn)單輸出一個(gè)成功標(biāo)識(shí)。

          Spring Boot 基礎(chǔ)的構(gòu)建這里就不介紹了,如果你對(duì) Spring Boot 還不是很熟悉,或者只是會(huì)簡(jiǎn)單的使用,那還是建議你深入學(xué)習(xí)下吧,推薦這個(gè) Spring Boot 學(xué)習(xí)倉庫,歡迎 Star 關(guān)注:

          https://github.com/javastacks/spring-boot-best-practice

          1、新建監(jiān)聽器

          import?lombok.extern.slf4j.Slf4j;
          import?org.springframework.boot.availability.AvailabilityChangeEvent;
          import?org.springframework.boot.availability.ReadinessState;
          import?org.springframework.context.ApplicationListener;

          /**
          ?*?來源微信公眾號(hào):Java技術(shù)棧
          ?*/
          @Slf4j
          public?class?JavastackListener?implements?ApplicationListener?{

          ????@Override
          ????public?void?onApplicationEvent(AvailabilityChangeEvent?event)?{
          ????????log.info("監(jiān)聽到事件:"?+?event);
          ????????if?(ReadinessState.ACCEPTING_TRAFFIC?==?event.getState()){
          ????????????log.info("應(yīng)用啟動(dòng)完成,可以請(qǐng)求了……");
          ????????}
          ????}

          }

          新建一個(gè)自定義監(jiān)聽器,實(shí)現(xiàn)了 ApplicationListener 接口,泛型 AvailabilityChangeEvent 表示僅僅監(jiān)聽 AvailabilityChangeEvent 事件。

          因第 8 步的事件和第 6 步的事件同名,我們可以根據(jù)事件的狀態(tài)來區(qū)分到底是哪一個(gè)環(huán)節(jié)的事件 。

          2、注冊(cè)監(jiān)聽器

          注冊(cè)監(jiān)聽器有兩種方式:

          1、在資源目錄中的 META-INF/spring.factories 文件中自動(dòng)注冊(cè):

          org.springframework.context.ApplicationListener=\
          cn.javastack.springboot.features.listener.JavastackListener

          2、如果是監(jiān)聽 Spring 應(yīng)用上下文(ApplicationContext)創(chuàng)建之后的事件,可以直接在監(jiān)聽器上使用 @Component 注解即可,否則需要使用第一種方法的自動(dòng)注冊(cè),因?yàn)?ApplicationContext 并未創(chuàng)建,這時(shí)的 Bean 是不能被加載的。

          3、應(yīng)用啟動(dòng)

          下面來看下啟動(dòng)日志:

          可以看到同時(shí)輸出了第 6 步和 8 步的監(jiān)聽日志,但只輸出第 8 步的啟動(dòng)完成日志,自定義監(jiān)聽實(shí)現(xiàn)成功。

          總結(jié)

          了解了 Spring Boot 啟動(dòng)過程中的各個(gè)事件及監(jiān)聽機(jī)制,大家可以依葫蘆畫瓢實(shí)現(xiàn) Spring Boot 啟動(dòng)過程中的各個(gè)自定義操作,比如說在啟動(dòng)過程上實(shí)現(xiàn)動(dòng)態(tài)注冊(cè)、移除 Bean 等。

          一般來說,不建議使用事件和監(jiān)聽器來實(shí)現(xiàn)比較耗時(shí)和繁重的任務(wù),這樣會(huì)影響應(yīng)用程序的正常啟動(dòng),考慮使用 Spring Boot 的 application/ command-line runners 來進(jìn)行實(shí)現(xiàn)。

          本文只是介紹了一下 Spring Boot 啟動(dòng)過程中的事件及如何實(shí)現(xiàn)自定義監(jiān)聽器,怎么實(shí)現(xiàn)一個(gè)業(yè)務(wù)上的自定義事件和監(jiān)聽器不在本文范圍之類,后續(xù)棧長(zhǎng)再開一篇,關(guān)注公眾號(hào)Java技術(shù)棧第一時(shí)間推送,不要走開。

          本文實(shí)踐所有源代碼已上傳:

          https://github.com/javastacks/spring-boot-best-practice

          參考資料:

          https://docs.spring.io/spring-boot/docs/2.3.5.RELEASE/reference/htmlsingle/#boot-features-application-events-and-listeners

          最后,覺得有收獲,在看、轉(zhuǎn)發(fā)一下哦,原創(chuàng)不易,需要鼓勵(lì)。

          版權(quán)申明:本文系公眾號(hào) "Java技術(shù)棧" 原創(chuàng),原創(chuàng)實(shí)屬不易,轉(zhuǎn)載、引用本文內(nèi)容請(qǐng)注明出處,禁止抄襲、洗稿,請(qǐng)自重,尊重他人勞動(dòng)成果和知識(shí)產(chǎn)權(quán)。






          關(guān)注Java技術(shù)??锤喔韶?/strong>



          戳原文,獲取精選面試題!
          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色视频网站亚洲 | 天堂AV免费观看 | 一级片免费 | 骚逼网站| 日本黄色免费一级A片 |