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