nacos 源碼解析系列(四)

Nacos中使用的監(jiān)聽(tīng)擴(kuò)展接口
  • SpringApplicationRunListener
  • ApplicationListener

SpringApplicationRunListener

SpringApplicationRunListener 接口的作用主要就是在Spring Boot 啟動(dòng)初始化的過(guò)程中可以通過(guò)SpringApplicationRunListener接口回調(diào)來(lái)讓用戶在啟動(dòng)的各個(gè)流程中可以加入自己的邏輯。

它也是 觀察者模式,Spring為我們提供了這個(gè)監(jiān)聽(tīng)器的擴(kuò)展接口;它監(jiān)聽(tīng)的就是SpringBoot啟動(dòng)初始化中下面的各個(gè)事件

SpringBoot啟動(dòng)過(guò)程的關(guān)鍵事件(按照觸發(fā)順序)包括:

  1. 開(kāi)始啟動(dòng)
  2. Environment構(gòu)建完成
  3. ApplicationContext構(gòu)建完成
  4. ApplicationContext完成加載
  5. ApplicationContext完成刷新并啟動(dòng)
  6. 啟動(dòng)完成
  7. 啟動(dòng)失敗
public interface SpringApplicationRunListener {
    //run()方法執(zhí)行時(shí),該方法立即被調(diào)用,用于初始化早期做一些事情
    void starting();
    //當(dāng)environment構(gòu)建完成,ApplicationContext創(chuàng)建之前,該方法被調(diào)用
    void environmentPrepared(ConfigurableEnvironment environment);
     //當(dāng)ApplicationContext構(gòu)建完成時(shí),該方法被調(diào)用
    void contextPrepared(ConfigurableApplicationContext context);
    //在ApplicationContext完成加載,但沒(méi)有被刷新前,該方法被調(diào)用
    void contextLoaded(ConfigurableApplicationContext context);
    //在ApplicationContext刷新并啟動(dòng)后,CommandLineRunners和ApplicationRunner未被調(diào)用前,該方法被調(diào)用
    void started(ConfigurableApplicationContext context);
    //在run()方法執(zhí)行完成前該方法被調(diào)用
    void running(ConfigurableApplicationContext context);
    //當(dāng)應(yīng)用運(yùn)行出錯(cuò)時(shí)該方法被調(diào)用
    void failed(ConfigurableApplicationContext context, Throwable exception);    
    
}

下面讓我們來(lái)首先自定義一個(gè) ApplicationRunListener 看下流程:

首先定義:HelloApplicationRunListener.class 實(shí)現(xiàn)SpringApplicationRunListener接口

public class HelloApplicationRunListener implements SpringApplicationRunListener {

    public HelloApplicationRunListener(SpringApplication application, String[] args) {
        System.out.println("constructor");
    }

    @Override
    public void starting() {
        System.out.println("starting......");
    }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
        System.out.println("environmentPrepared......");
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("contextPrepared......");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("contextLoaded......");
    }

    @Override
    public void started(ConfigurableApplicationContext context) {
        System.out.println("started......");
    }

    @Override
    public void running(ConfigurableApplicationContext context) {
        System.out.println("running......");
    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.out.println("failed......");
    }
}
其中注意:必須包含一個(gè)構(gòu)造函數(shù)??!

再次加入spring.factories

org.springframework.boot.SpringApplicationRunListener= com.io.nacos.nacosdemo.controller.listener.HelloApplicationRunListener

最后啟動(dòng)項(xiàng)目,可以看到打印出來(lái)的信息。

對(duì)比 nacos 源碼 你可以看到 nacos 實(shí)現(xiàn)SpringApplicationRunListener 做了哪些

配置工作~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容