SpringBoot應(yīng)用程序啟動(dòng)監(jiān)聽功能的常見方法
一、監(jiān)聽?wèi)?yīng)用啟動(dòng)的常見場(chǎng)景
應(yīng)用啟動(dòng)監(jiān)聽在 Spring Boot 和其他框架中扮演著重要的角色。它們的主要作用是在應(yīng)用啟動(dòng)或關(guān)閉時(shí)觸發(fā)特定的操作或任務(wù)。
以下是一些常見的應(yīng)用啟動(dòng)監(jiān)聽場(chǎng)景:
- 初始化操作:在應(yīng)用啟動(dòng)時(shí),你可能需要執(zhí)行一些特定的初始化操作,例如加載配置文件、建立數(shù)據(jù)庫連接池等。通過實(shí)現(xiàn)
ApplicationListener接口或使用@EventListener注解,你可以在這些關(guān)鍵時(shí)刻添加自定義邏輯,確保你的應(yīng)用程序能夠正確地啟動(dòng)并運(yùn)行。 - 數(shù)據(jù)預(yù)處理:在應(yīng)用啟動(dòng)時(shí),你可能需要進(jìn)行數(shù)據(jù)預(yù)處理,例如清理上一次運(yùn)行遺留的垃圾數(shù)據(jù)或者將常用的數(shù)據(jù)加載到內(nèi)存中。通過實(shí)現(xiàn)
CommandLineRunner或ApplicationRunner接口,你可以在應(yīng)用啟動(dòng)后執(zhí)行這些任務(wù)。 - 系統(tǒng)通知:當(dāng)應(yīng)用成功啟動(dòng)時(shí),你可以發(fā)送一個(gè)系統(tǒng)通知,例如通過郵件或消息隊(duì)列通知其他系統(tǒng)或管理員。這可以幫助你與其他系統(tǒng)集成,提供統(tǒng)一的監(jiān)控和管理界面。
- 健康檢查和監(jiān)控:通過定義健康檢查端點(diǎn)、指標(biāo)收集等功能,你可以對(duì)應(yīng)用進(jìn)行健康檢查和監(jiān)控。這些功能通常由 Spring Boot Actuator 提供支持。通過監(jiān)聽相應(yīng)的事件,你可以在應(yīng)用啟動(dòng)時(shí)啟用或禁用這些功能。
- 依賴服務(wù)檢查:在應(yīng)用啟動(dòng)階段,可以檢查依賴服務(wù)(如數(shù)據(jù)庫、消息隊(duì)列、緩存等)是否可用,并在不可用時(shí)采取適當(dāng)?shù)拇胧缪舆t啟動(dòng)或記錄錯(cuò)誤。這有助于確保你的應(yīng)用程序能夠在穩(wěn)定的環(huán)境下正常運(yùn)行。
- 動(dòng)態(tài)配置更新:在一些情況下,你需要根據(jù)環(huán)境變量或其他條件來動(dòng)態(tài)更新應(yīng)用的配置。通過監(jiān)聽配置文件的修改事件,你可以在應(yīng)用啟動(dòng)時(shí)重新加載配置,以適應(yīng)不同的環(huán)境或配置變化。
- 日志記錄:在應(yīng)用啟動(dòng)過程中,你可能希望記錄一些關(guān)鍵信息,例如啟動(dòng)時(shí)間、版本號(hào)、運(yùn)行環(huán)境等。這將有助于問題排查和審計(jì)工作。
- 安全性檢查:在某些情況下,你可能需要在應(yīng)用啟動(dòng)階段執(zhí)行安全性相關(guān)的檢查,例如驗(yàn)證加密密鑰、檢查安全漏洞等。通過監(jiān)聽相應(yīng)的事件,你可以執(zhí)行這些檢查以確保應(yīng)用的安全性。
二、監(jiān)聽?wèi)?yīng)用啟動(dòng)的方法
在 Spring Boot 中,你可以通過實(shí)現(xiàn) ApplicationListener 接口、使用 @EventListener 注解或?qū)崿F(xiàn) CommandLineRunner / ApplicationRunner 接口來創(chuàng)建自定義的啟動(dòng)監(jiān)聽器。這些監(jiān)聽器使得你能夠在應(yīng)用生命周期的關(guān)鍵時(shí)刻執(zhí)行自定義邏輯,從而增強(qiáng)應(yīng)用的可用性、可維護(hù)性和健壯性。
在 Spring Boot 應(yīng)用中,你可以通過實(shí)現(xiàn)特定的接口或使用注解來監(jiān)聽?wèi)?yīng)用的啟動(dòng)和關(guān)閉事件。以下是一些常見的方法:
1)實(shí)現(xiàn) ApplicationListener 接口:
你可以創(chuàng)建一個(gè)類來實(shí)現(xiàn) ApplicationListener 接口,并指定要監(jiān)聽的事件類型。例如,要監(jiān)聽?wèi)?yīng)用啟動(dòng)完成事件,你可以這樣做:
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent> {
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
// 處理應(yīng)用啟動(dòng)完成事件
}
}
2)使用 @EventListener 注解:
在 Spring 4.2 及以上版本中,你可以使用 @EventListener 注解來監(jiān)聽事件,而無需實(shí)現(xiàn) ApplicationListener 接口。例如:
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class MyEventListener {
@EventListener(ApplicationReadyEvent.class)
public void onApplicationReadyEvent(ApplicationReadyEvent event) {
// 處理應(yīng)用啟動(dòng)完成事件
}
}
3)使用 ApplicationRunner 或 CommandLineRunner 接口:
雖然這不是嚴(yán)格意義上的監(jiān)聽器,但 ApplicationRunner 和 CommandLineRunner 接口提供了一種在應(yīng)用啟動(dòng)后執(zhí)行代碼的方法。這兩個(gè)接口非常相似,唯一的區(qū)別是 CommandLineRunner 的 run 方法接收一個(gè)字符串?dāng)?shù)組作為參數(shù),而 ApplicationRunner 的 run 方法接收一個(gè) ApplicationArguments 對(duì)象。
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
// 應(yīng)用啟動(dòng)后執(zhí)行代碼
}
}
4)Spring Boot Actuator 的健康檢查和指標(biāo):
雖然不是監(jiān)聽器,但如果你想要在應(yīng)用運(yùn)行時(shí)監(jiān)控其狀態(tài),你可以使用 Spring Boot Actuator。它提供了健康檢查、指標(biāo)收集等功能。
5)Spring Framework 的事件監(jiān)聽:
除了 Spring Boot 提供的事件外,你還可以監(jiān)聽 Spring Framework 定義的事件,例如 ContextRefreshedEvent(當(dāng) ApplicationContext 被初始化或刷新時(shí)觸發(fā))。
記住,當(dāng)你創(chuàng)建監(jiān)聽器時(shí),確保它們被 Spring 容器管理(例如,通過 @Component 注解將它們聲明為 bean),這樣它們才能正確接收到事件通知。
三、SpringBoot不同階段的事件
Spring Boot應(yīng)用啟動(dòng)過程中的不同階段分表對(duì)應(yīng)不同的事件:
1)ApplicationStartingEvent:
- 這個(gè)事件在應(yīng)用啟動(dòng)開始時(shí)觸發(fā),非常早期,甚至在任何 Spring 容器刷新之前。
- 它通常用于執(zhí)行非常早期的初始化代碼,或者監(jiān)聽系統(tǒng)屬性、環(huán)境變量等。
2)ApplicationEnvironmentPreparedEvent:
- 當(dāng) Spring Boot 的
Environment準(zhǔn)備好并且已經(jīng)應(yīng)用了任何可用的PropertySource,但在ApplicationContext創(chuàng)建之前觸發(fā)。 - 你可以使用這個(gè)事件來修改或添加屬性源。
3)ApplicationPreparedEvent:
- 在 Spring 上下文被刷新之前,但在
bean definitions被加載之后觸發(fā)。 - 此時(shí),你可以訪問應(yīng)用上下文,但是 beans 還沒有被創(chuàng)建。
4)ApplicationStartedEvent:
- 在 Spring 上下文刷新之后觸發(fā),意味著所有的
bean已經(jīng)被創(chuàng)建,但還沒有調(diào)用任何CommandLineRunner或ApplicationRunner。 - 此時(shí),應(yīng)用已經(jīng)啟動(dòng),但可能還沒有準(zhǔn)備好處理請(qǐng)求。
5)ApplicationReadyEvent:
- 當(dāng)應(yīng)用已經(jīng)啟動(dòng)并且準(zhǔn)備好了處理請(qǐng)求時(shí)觸發(fā)。
- 這通常意味著所有的
CommandLineRunner和ApplicationRunner都已經(jīng)被調(diào)用,并且應(yīng)用已經(jīng)完成了其啟動(dòng)過程。
6)ApplicationFailedEvent:
- 如果應(yīng)用啟動(dòng)失敗,則會(huì)觸發(fā)此事件。
- 這允許你執(zhí)行一些清理工作,或者記錄關(guān)于失敗的信息。
通過監(jiān)聽這些事件,你可以在應(yīng)用啟動(dòng)和關(guān)閉的不同階段執(zhí)行自定義邏輯,從而實(shí)現(xiàn)更精細(xì)的控制和擴(kuò)展性。例如,你可能希望在 ApplicationReadyEvent 觸發(fā)后發(fā)送一個(gè)通知,表明應(yīng)用已成功啟動(dòng)并準(zhǔn)備好接收請(qǐng)求?;蛘撸?nbsp;ApplicationFailedEvent 觸發(fā)時(shí),你可能想要記錄詳細(xì)的錯(cuò)誤日志,并通知管理員。
拓展:Springboot 項(xiàng)目啟動(dòng)、關(guān)閉 的監(jiān)聽
想在項(xiàng)目啟動(dòng)或是關(guān)閉的時(shí)候, 做些事情。
例如啟動(dòng)時(shí),打印輸出 “你好” , 關(guān)閉時(shí),打印輸出 “再見”。
示例:

其實(shí)方式很多,但是我推薦 根據(jù)官方白皮的建議做。
啟動(dòng)的監(jiān)聽:

如果需要在SpringApplication啟動(dòng)后運(yùn)行某些特定代碼,可以實(shí)現(xiàn)ApplicationRunner或CommandLineRunner接口。兩個(gè)接口以相同的方式工作,并提供一個(gè)單獨(dú)的運(yùn)行方法,該方法在SpringApplication.run(…?) 完成。
關(guān)閉的監(jiān)聽:

每個(gè)SpringApplication都向JVM注冊(cè)一個(gè)關(guān)閉掛鉤,以確保ApplicationContext在退出時(shí)正常關(guān)閉。可以使用所有標(biāo)準(zhǔn)的Spring生命周期回調(diào)(如DisposableBean接口或@PreDestroy注釋)。
示例使用代碼:
StandGuard.jav
import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class StandGuard implements ApplicationRunner, DisposableBean {
@Override
public void run(ApplicationArguments args) {
System.out.println("你好。");
}
@Override
public void destroy() {
System.out.println("再見!");
}
}效果:

以上就是SpringBoot應(yīng)用程序啟動(dòng)監(jiān)聽功能的常見方法的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot應(yīng)用啟動(dòng)監(jiān)聽的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java基于反射機(jī)制實(shí)現(xiàn)全部注解獲取的方法示例
這篇文章主要介紹了Java基于反射機(jī)制實(shí)現(xiàn)全部注解獲取的方法,結(jié)合實(shí)例形式分析了java反射機(jī)制獲取注解的具體實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
Mybatis逆向工程實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫
本文主要介紹了Mybatis逆向工程實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Java中實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消功能(最新推薦)
本文介紹了Java中實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消功能的幾種方法,包括定時(shí)任務(wù)、JDK延遲隊(duì)列、Redis過期監(jiān)聽、Redisson分布式延遲隊(duì)列、RocketMQ延遲消息和RabbitMQ死信隊(duì)列,每種方法都有其優(yōu)缺點(diǎn),可以根據(jù)具體需求選擇合適的方法,感興趣的朋友一起看看吧2025-02-02
Spring Boot+Mybatis+Pagehelper分頁實(shí)現(xiàn)
本篇文章主要講述的是Spring Boot+Mybatis+Pagehelper分頁實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
詳解Java中IO字節(jié)流基本操作(復(fù)制文件)并測(cè)試性能
這篇文章主要介紹了Java中IO字節(jié)流基本操作(復(fù)制文件)并測(cè)試性能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

