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ā)順序)包括:
- 開(kāi)始啟動(dòng)
- Environment構(gòu)建完成
- ApplicationContext構(gòu)建完成
- ApplicationContext完成加載
- ApplicationContext完成刷新并啟動(dòng)
- 啟動(dòng)完成
- 啟動(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 做了哪些
配置工作~~