1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 3653字,需瀏覽 8分鐘

         ·

        2020-12-16 23:10

        Java技術棧

        www.javastack.cn

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



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

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

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

        Spring Boot 啟動事件順序

        1、ApplicationStartingEvent

        這個事件在 Spring Boot 應用運行開始時,且進行任何處理之前發(fā)送(除了監(jiān)聽器和初始化器注冊之外)。

        2、ApplicationEnvironmentPreparedEvent

        這個事件在當已知要在上下文中使用 Spring 環(huán)境(Environment)時,在 Spring 上下文(context)創(chuàng)建之前發(fā)送。

        3、ApplicationContextInitializedEvent

        這個事件在當 ?Spring 應用上下文(ApplicationContext)準備好了,并且應用初始化器(ApplicationContextInitializers)已經(jīng)被調(diào)用,在 bean 的定義(bean definitions)被加載之前發(fā)送。

        4、ApplicationPreparedEvent

        這個事件是在 ?Spring 上下文(context)刷新之前,且在 bean 的定義(bean definitions)被加載之后發(fā)送。

        5、ApplicationStartedEvent

        這個事件是在 ?Spring 上下文(context)刷新之后,且在 application/ command-line runners 被調(diào)用之前發(fā)送。

        6、AvailabilityChangeEvent

        這個事件緊隨上個事件之后發(fā)送,狀態(tài):ReadinessState.CORRECT,表示應用已處于活動狀態(tài)。

        7、ApplicationReadyEvent

        這個事件在任何 application/ command-line runners 調(diào)用之后發(fā)送。

        8、AvailabilityChangeEvent

        這個事件緊隨上個事件之后發(fā)送,狀態(tài):ReadinessState.ACCEPTING_TRAFFIC,表示應用可以開始準備接收請求了。

        9、ApplicationFailedEvent

        這個事件在應用啟動異常時進行發(fā)送。


        上面所介紹的這些事件列表僅包括綁定到 SpringApplication 的 SpringApplicationEvents 事件,除了這些事件以外,以下事件也會在 ApplicationPreparedEvent 之后和 ApplicationStartedEvent 之前發(fā)送:

        • WebServerInitializedEvent

          這個 Web 服務器初始化事件在 WebServer 啟動之后發(fā)送,對應的還有 ServletWebServerInitializedEvent(Servlet Web 服務器初始化事件)、ReactiveWebServerInitializedEvent(響應式 Web 服務器初始化事件)。

        • ContextRefreshedEvent

          這個上下文刷新事件是在 Spring 應用上下文(ApplicationContext)刷新之后發(fā)送。


        自定義啟動事件監(jiān)聽器

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

        比如我們想在上面的第 8 步,即應用啟動完成可以接收請求了,我們簡單輸出一個成功標識。

        Spring Boot 基礎的構(gòu)建這里就不介紹了,如果你對 Spring Boot 還不是很熟悉,或者只是會簡單的使用,那還是建議你深入學習下吧,推薦這個 Spring Boot 學習倉庫,歡迎 Star 關注:

        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;

        /**
        ?*?來源微信公眾號:Java技術棧
        ?*/
        @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("應用啟動完成,可以請求了……");
        ????????}
        ????}

        }

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

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

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

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

        1、在資源目錄中的 META-INF/spring.factories 文件中自動注冊:

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

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

        3、應用啟動

        下面來看下啟動日志:

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

        總結(jié)

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

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

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

        本文實踐所有源代碼已上傳:

        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)不易,需要鼓勵。

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






        關注Java技術棧看更多干貨



        戳原文,獲取精選面試題!
        瀏覽 34
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产又粗又猛又爽又黄的视频一 | 午夜综合福利 | 国产成人乱码一二三区性色 | 色人久久 | 久久午夜无码鲁丝片午夜精 | 四虎视频精品免费观看 | 操逼毛片黄色毛片视频 | 日韩小视频在线 | 一区二区三区免费播放 | 黄色片免费 |