Spring中的監(jiān)聽器SpringApplicationRunListener詳解
SpringApplicationRunListenerde作用
命名我們就可以知道它是一個(gè)監(jiān)聽者,分析springboot啟動(dòng)流程我們會(huì)發(fā)現(xiàn),它其實(shí)是用來在整個(gè)啟動(dòng)流程中接收不同執(zhí)行點(diǎn)事件通知的監(jiān)聽者
SpringApplicationRunListener接口規(guī)定了SpringBoot的生命周期,在各個(gè)生命周期廣播相應(yīng)的事件,調(diào)用實(shí)際的ApplicationListener類。
源碼分析


前面分析過,前面講過啟動(dòng)的時(shí)候會(huì)先加載spring會(huì)加載所有jar包下的META-INF/spring.factories,然后緩存起來,這里就可以通過類型進(jìn)行獲取;
然后通過反射,實(shí)例化SpringApplicationRunListener類;注意,前面講過實(shí)例化的類型,一個(gè)是SpringApplication類型,一個(gè)String數(shù)組類型;

然后就會(huì)在springboot容器的各個(gè)階段通過封裝的類SpringApplicationRunListeners進(jìn)行處理;
方法詳解
public interface SpringApplicationRunListener {
//剛執(zhí)行run方法時(shí)
void started();
//環(huán)境建立好時(shí)候
void environmentPrepared(ConfigurableEnvironment environment);
//上下文建立好的時(shí)候
void contextPrepared(ConfigurableApplicationContext context);
//上下文載入配置時(shí)候
void contextLoaded(ConfigurableApplicationContext context);
//上下文刷新完成后,run方法執(zhí)行完之前
void finished(ConfigurableApplicationContext context, Throwable exception);
}
具體使用
新建類實(shí)現(xiàn)SpringApplicationRunListener,需要構(gòu)造方法,里面兩個(gè)參數(shù)SpringApplication sa, String[] args;
在resources下新建META-INF\spring.factories文件,文件里面將新建的實(shí)現(xiàn)類的類路徑配置進(jìn)去:
org.springframework.boot.SpringApplicationRunListener=com.study.springbootplus.config.MyApplicationRunListener
public class MyApplicationRunListener implements SpringApplicationRunListener {
private final SpringApplication application;
private final String[] args;
public MyApplicationRunListener(SpringApplication sa, String[] args) {
this.application = sa;
this.args = args;
}
@Override
public void starting() {
System.out.println("服務(wù)啟動(dòng)RunnerTest SpringApplicationRunListener的starting方法...");
}
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
System.out.println("服務(wù)啟動(dòng)RunnerTest SpringApplicationRunListener的environmentPrepared方法...");
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
System.out.println("服務(wù)啟動(dòng)RunnerTest SpringApplicationRunListener的contextPrepared方法...");
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
System.out.println("服務(wù)啟動(dòng)RunnerTest SpringApplicationRunListener的contextLoaded方法...");
}
@Override
public void running(ConfigurableApplicationContext context) {
System.out.println("服務(wù)啟動(dòng)RunnerTest SpringApplicationRunListener的running方法...");
}
@Override
public void failed(ConfigurableApplicationContext context, Throwable exception) {
System.out.println("服務(wù)啟動(dòng)RunnerTest SpringApplicationRunListener的failed方法...");
}
@Override
public void started(ConfigurableApplicationContext context) {
System.out.println("服務(wù)啟動(dòng)RunnerTest SpringApplicationRunListener的started方法...");
}
}
注意事項(xiàng)
- 任何一個(gè)SpringApplicationRunListener實(shí)現(xiàn)類的構(gòu)造方法都需要有兩個(gè)構(gòu)造參數(shù);源碼里面分析了,需要根據(jù)指定類型的構(gòu)造方法初始化類;
- SpringApplicationRunListener的配置在resources下新建META-INF\spring.factories文件,文件里面將新建的實(shí)現(xiàn)類的類路徑配置進(jìn)去,對應(yīng)的key是org.springframework.boot.SpringApplicationRunListener;
- SpringApplicationRunListener屬于應(yīng)用程序啟動(dòng)層面的監(jiān)聽器,在springboot啟動(dòng)時(shí)候,調(diào)用run方法進(jìn)行反射加載初始化。此時(shí)上下文還沒有加載,如果通過@Compnant是起不了作用的.
到此這篇關(guān)于Spring中的監(jiān)聽器SpringApplicationRunListener詳解的文章就介紹到這了,更多相關(guān)Spring的SpringApplicationRunListener內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot使用@WebListener?作為web監(jiān)聽器的過程解析
- SpringBoot中添加監(jiān)聽器及創(chuàng)建線程的代碼示例
- Spring?Boot攔截器和監(jiān)聽器實(shí)現(xiàn)對請求和響應(yīng)處理實(shí)戰(zhàn)
- SpringBoot 過濾器, 攔截器, 監(jiān)聽器的具體使用
- Spring事件監(jiān)聽器ApplicationListener源碼詳解
- SpringBoot使用過濾器、攔截器和監(jiān)聽器的案例代碼(Springboot搭建java項(xiàng)目)
- SpringBoot深入分析講解監(jiān)聽器模式下
相關(guān)文章
Java中StringBuilder字符串類型的操作方法及API整理
Java中的StringBuffer類繼承于AbstractStringBuilder,用來創(chuàng)建非線程安全的字符串類型對象,下面即是對Java中StringBuilder字符串類型的操作方法及API整理2016-05-05
HttpClient 在Java項(xiàng)目中的使用詳解
HttpClient作為訪問Http服務(wù)的客戶端訪問程序已經(jīng)被廣泛使用,提高了開發(fā)效率,也提高了代碼的健壯性。因此熟練掌握HttpClient是必需的,關(guān)于httpclient感興趣的朋友可以參考本篇文章2015-10-10
使用SpringBoot根據(jù)配置注入接口的不同實(shí)現(xiàn)類(代碼演示)
使用springboot開發(fā)時(shí)經(jīng)常用到@Autowired和@Resource進(jìn)行依賴注入,但是當(dāng)我們一個(gè)接口對應(yīng)多個(gè)不同的實(shí)現(xiàn)類的時(shí)候如果不進(jìn)行一下配置項(xiàng)目啟動(dòng)時(shí)就會(huì)報(bào)錯(cuò),那么怎么根據(jù)不同的需求注入不同的類型呢,感興趣的朋友一起看看吧2022-06-06
Java UUID 五個(gè)版本的區(qū)別及使用場景小結(jié)
在Java中,UUID是一個(gè)128位的唯一標(biāo)識符,廣泛應(yīng)用于生成唯一標(biāo)識符、分布式系統(tǒng)唯一鍵等場景,Java提供的java.util.UUID類支持五種UUID版本,每種具有不同的生成方式和使用場景,本文就來介紹一下如何使用,感興趣的可以了解一下2024-11-11
java實(shí)現(xiàn)二叉樹的創(chuàng)建及5種遍歷方法(總結(jié))
下面小編就為大家?guī)硪黄猨ava實(shí)現(xiàn)二叉樹的創(chuàng)建及5種遍歷方法(總結(jié))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04

