SpringBoot應(yīng)用程序啟動監(jiān)聽功能的常見方法
一、監(jiān)聽?wèi)?yīng)用啟動的常見場景
應(yīng)用啟動監(jiān)聽在 Spring Boot 和其他框架中扮演著重要的角色。它們的主要作用是在應(yīng)用啟動或關(guān)閉時觸發(fā)特定的操作或任務(wù)。
以下是一些常見的應(yīng)用啟動監(jiān)聽場景:
- 初始化操作:在應(yīng)用啟動時,你可能需要執(zhí)行一些特定的初始化操作,例如加載配置文件、建立數(shù)據(jù)庫連接池等。通過實(shí)現(xiàn)
ApplicationListener
接口或使用@EventListener
注解,你可以在這些關(guān)鍵時刻添加自定義邏輯,確保你的應(yīng)用程序能夠正確地啟動并運(yùn)行。 - 數(shù)據(jù)預(yù)處理:在應(yīng)用啟動時,你可能需要進(jìn)行數(shù)據(jù)預(yù)處理,例如清理上一次運(yùn)行遺留的垃圾數(shù)據(jù)或者將常用的數(shù)據(jù)加載到內(nèi)存中。通過實(shí)現(xiàn)
CommandLineRunner
或ApplicationRunner
接口,你可以在應(yīng)用啟動后執(zhí)行這些任務(wù)。 - 系統(tǒng)通知:當(dāng)應(yīng)用成功啟動時,你可以發(fā)送一個系統(tǒng)通知,例如通過郵件或消息隊(duì)列通知其他系統(tǒng)或管理員。這可以幫助你與其他系統(tǒng)集成,提供統(tǒng)一的監(jiān)控和管理界面。
- 健康檢查和監(jiān)控:通過定義健康檢查端點(diǎn)、指標(biāo)收集等功能,你可以對應(yīng)用進(jìn)行健康檢查和監(jiān)控。這些功能通常由 Spring Boot Actuator 提供支持。通過監(jiān)聽相應(yīng)的事件,你可以在應(yīng)用啟動時啟用或禁用這些功能。
- 依賴服務(wù)檢查:在應(yīng)用啟動階段,可以檢查依賴服務(wù)(如數(shù)據(jù)庫、消息隊(duì)列、緩存等)是否可用,并在不可用時采取適當(dāng)?shù)拇胧?,如延遲啟動或記錄錯誤。這有助于確保你的應(yīng)用程序能夠在穩(wěn)定的環(huán)境下正常運(yùn)行。
- 動態(tài)配置更新:在一些情況下,你需要根據(jù)環(huán)境變量或其他條件來動態(tài)更新應(yīng)用的配置。通過監(jiān)聽配置文件的修改事件,你可以在應(yīng)用啟動時重新加載配置,以適應(yīng)不同的環(huán)境或配置變化。
- 日志記錄:在應(yīng)用啟動過程中,你可能希望記錄一些關(guān)鍵信息,例如啟動時間、版本號、運(yùn)行環(huán)境等。這將有助于問題排查和審計(jì)工作。
- 安全性檢查:在某些情況下,你可能需要在應(yīng)用啟動階段執(zhí)行安全性相關(guān)的檢查,例如驗(yàn)證加密密鑰、檢查安全漏洞等。通過監(jiān)聽相應(yīng)的事件,你可以執(zhí)行這些檢查以確保應(yīng)用的安全性。
二、監(jiān)聽?wèi)?yīng)用啟動的方法
在 Spring Boot 中,你可以通過實(shí)現(xiàn) ApplicationListener
接口、使用 @EventListener
注解或?qū)崿F(xiàn) CommandLineRunner
/ ApplicationRunner
接口來創(chuàng)建自定義的啟動監(jiān)聽器。這些監(jiān)聽器使得你能夠在應(yīng)用生命周期的關(guān)鍵時刻執(zhí)行自定義邏輯,從而增強(qiáng)應(yīng)用的可用性、可維護(hù)性和健壯性。
在 Spring Boot 應(yīng)用中,你可以通過實(shí)現(xiàn)特定的接口或使用注解來監(jiān)聽?wèi)?yīng)用的啟動和關(guān)閉事件。以下是一些常見的方法:
1)實(shí)現(xiàn) ApplicationListener
接口:
你可以創(chuàng)建一個類來實(shí)現(xiàn) ApplicationListener
接口,并指定要監(jiān)聽的事件類型。例如,要監(jiān)聽?wèi)?yī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)用啟動完成事件 } }
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)用啟動完成事件 } }
3)使用 ApplicationRunner
或 CommandLineRunner
接口:
雖然這不是嚴(yán)格意義上的監(jiān)聽器,但 ApplicationRunner
和 CommandLineRunner
接口提供了一種在應(yīng)用啟動后執(zhí)行代碼的方法。這兩個接口非常相似,唯一的區(qū)別是 CommandLineRunner
的 run
方法接收一個字符串?dāng)?shù)組作為參數(shù),而 ApplicationRunner
的 run
方法接收一個 ApplicationArguments
對象。
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)用啟動后執(zhí)行代碼 } }
4)Spring Boot Actuator 的健康檢查和指標(biāo):
雖然不是監(jiān)聽器,但如果你想要在應(yīng)用運(yùn)行時監(jiān)控其狀態(tài),你可以使用 Spring Boot Actuator。它提供了健康檢查、指標(biāo)收集等功能。
5)Spring Framework 的事件監(jiān)聽:
除了 Spring Boot 提供的事件外,你還可以監(jiān)聽 Spring Framework 定義的事件,例如 ContextRefreshedEvent
(當(dāng) ApplicationContext 被初始化或刷新時觸發(fā))。
記住,當(dāng)你創(chuàng)建監(jiān)聽器時,確保它們被 Spring 容器管理(例如,通過 @Component
注解將它們聲明為 bean),這樣它們才能正確接收到事件通知。
三、SpringBoot不同階段的事件
Spring Boot應(yīng)用啟動過程中的不同階段分表對應(yīng)不同的事件:
1)ApplicationStartingEvent:
- 這個事件在應(yīng)用啟動開始時觸發(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ā)。 - 你可以使用這個事件來修改或添加屬性源。
3)ApplicationPreparedEvent:
- 在 Spring 上下文被刷新之前,但在
bean definitions
被加載之后觸發(fā)。 - 此時,你可以訪問應(yīng)用上下文,但是 beans 還沒有被創(chuàng)建。
4)ApplicationStartedEvent:
- 在 Spring 上下文刷新之后觸發(fā),意味著所有的
bean
已經(jīng)被創(chuàng)建,但還沒有調(diào)用任何CommandLineRunner
或ApplicationRunner
。 - 此時,應(yīng)用已經(jīng)啟動,但可能還沒有準(zhǔn)備好處理請求。
5)ApplicationReadyEvent:
- 當(dāng)應(yīng)用已經(jīng)啟動并且準(zhǔn)備好了處理請求時觸發(fā)。
- 這通常意味著所有的
CommandLineRunner
和ApplicationRunner
都已經(jīng)被調(diào)用,并且應(yīng)用已經(jīng)完成了其啟動過程。
6)ApplicationFailedEvent:
- 如果應(yīng)用啟動失敗,則會觸發(fā)此事件。
- 這允許你執(zhí)行一些清理工作,或者記錄關(guān)于失敗的信息。
通過監(jiān)聽這些事件,你可以在應(yīng)用啟動和關(guān)閉的不同階段執(zhí)行自定義邏輯,從而實(shí)現(xiàn)更精細(xì)的控制和擴(kuò)展性。例如,你可能希望在 ApplicationReadyEvent
觸發(fā)后發(fā)送一個通知,表明應(yīng)用已成功啟動并準(zhǔn)備好接收請求。或者,在 ApplicationFailedEvent
觸發(fā)時,你可能想要記錄詳細(xì)的錯誤日志,并通知管理員。
拓展:Springboot 項(xiàng)目啟動、關(guān)閉 的監(jiān)聽
想在項(xiàng)目啟動或是關(guān)閉的時候, 做些事情。
例如啟動時,打印輸出 “你好” , 關(guān)閉時,打印輸出 “再見”。
示例:
其實(shí)方式很多,但是我推薦 根據(jù)官方白皮的建議做。
啟動的監(jiān)聽:
如果需要在SpringApplication啟動后運(yùn)行某些特定代碼,可以實(shí)現(xiàn)ApplicationRunner或CommandLineRunner接口。兩個接口以相同的方式工作,并提供一個單獨(dú)的運(yùn)行方法,該方法在SpringApplication.run(…?) 完成。
關(guān)閉的監(jiān)聽:
每個SpringApplication都向JVM注冊一個關(guān)閉掛鉤,以確保ApplicationContext在退出時正常關(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)用程序啟動監(jiān)聽功能的常見方法的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot應(yīng)用啟動監(jiān)聽的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot下RabbitMq實(shí)現(xiàn)定時任務(wù)
這篇文章主要為大家詳細(xì)介紹了SpringBoot下RabbitMq實(shí)現(xiàn)定時任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11SpringBoot使用攔截器Interceptor實(shí)現(xiàn)統(tǒng)一角色權(quán)限校驗(yàn)
角色權(quán)限校驗(yàn),是保證接口安全必備的能力:有權(quán)限才可以操作,所以,一般對于這種通用邏輯,推薦不與主業(yè)務(wù)邏輯耦合,那么怎么來解耦,那么本文小編就給大家詳細(xì)講解如何使用攔截器Interceptor實(shí)現(xiàn)統(tǒng)一角色權(quán)限校驗(yàn),需要的朋友可以參考下2023-07-07Schedule定時任務(wù)在分布式產(chǎn)生的問題詳解
這篇文章主要介紹了Schedule定時任務(wù)在分布式產(chǎn)生的問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Java將對象寫入文件讀出_序列化與反序列化的實(shí)例
下面小編就為大家?guī)硪黄狫ava將對象寫入文件讀出_序列化與反序列化的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08Windows下 IDEA編譯調(diào)試 hive2.3.9的過程解析
這篇文章主要介紹了Windows下 IDEA編譯調(diào)試 hive2.3.9的過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Spring Web MVC和Hibernate的集成配置詳解
這篇文章主要介紹了Spring Web MVC和Hibernate的集成配置詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12Spring Boot中自定義注解結(jié)合AOP實(shí)現(xiàn)主備庫切換問題
這篇文章主要介紹了Spring Boot中自定義注解+AOP實(shí)現(xiàn)主備庫切換的相關(guān)知識,本篇文章的場景是做調(diào)度中心和監(jiān)控中心時的需求,后端使用TDDL實(shí)現(xiàn)分表分庫,需要的朋友可以參考下2019-08-08springboot使用@KafkaListener監(jiān)聽多個kafka配置實(shí)現(xiàn)
當(dāng)服務(wù)中需要監(jiān)聽多個kafka時,?需要配置多個kafka,本文主要介紹了springboot使用@KafkaListener監(jiān)聽多個kafka配置實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04