Spring Boot Application 事件和監聽器
- 尋找到application.yml的讀取的操作,
- 從spring.factories 中查看到
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
- ConfigFileApplicationListener 該物件對application.yml進行讀取操作
- ConfigFileApplicationListener 事件的監聽器, 繼承了SmartApplicationListener介面
- SmartApplicationListener 介面繼承了ApplicationListener 和 Ordered介面,能夠實作有序監聽,
一、SmartApplicationListener介紹
- Spring ApplicationEvent以及對應的Listener提供了一個事件監聽、發布訂閱的實作,內部實作方式是觀察者模式,可以解耦業務系統之間的業務,提供系統的可拓展性、復用性以及可維護性,
- 在application.yml檔案讀取完會觸發一個事件ConfigFileApplicationListener 該監聽器實作檔案的讀取,
- SmartApplicationListener是高級監聽器,是ApplicationListener的子類,能夠實作有序監聽
- SmartApplicationListener提供了兩個方法:
/**
* 指定支持哪些型別的事件
*/
boolean supportsEventType(Class<? extends ApplicationEvent> var1);
/**
* 指定支持發生事件所在的型別
*/
boolean supportsSourceType(Class<?> var1);
如何在 SmartApplicationListener 實作監聽解耦
- 1、我們只需在加載完成之后去加入一個監聽器,
- 2、繼承SmartApplicationListener介面
- 3、設定order屬性決定監聽器的順序 ConfigFileApplicationListener.DEFAULT_ORDER + 1
- 4、將application.yml內容讀取之后并修改
二、ConfigFileApplicationListener
- ConfigFileApplicationListener 是用來 讀取組態檔的, 可以這樣來粗劣的介紹一下
- 詳情可以請看 springboot啟動時是如何加載組態檔application.yml檔案
三、最終結果:
- 新增一個監聽器 既然我們要在組態檔加載之后搞事情那么我們直接復制ConfigFileApplicationListener 的實作方式
- 洗掉一下不需要處理的操作(大概就是以下代碼) 并且order在ConfigFileApplicationListener 之后
public class AfterConfigListener implements SmartApplicationListener,Ordered {
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType) || ApplicationPreparedEvent.class.isAssignableFrom(eventType);
}
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationEnvironmentPreparedEvent) {
}
if (event instanceof ApplicationPreparedEvent) {
}
}
@Override
public int getOrder() {
// 寫在加載組態檔之后
return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
}
}
- 這樣子就完成了組態檔之后的代碼監聽, SmartApplicationListener又是實作了ApplicationListener的監聽的,那么我們可以在onApplicationEvent執行代碼,
- 完善代碼如下, 監聽并且獲取組態檔內容
public class AfterConfigListener implements SmartApplicationListener,Ordered {
// 復制的ConfigFileApplicationListener檔案內容
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType) || ApplicationPreparedEvent.class.isAssignableFrom(eventType);
}
public void onApplicationEvent(ApplicationEvent event) {
// ApplicationEnvironmentPreparedEvent 是加載組態檔,初始化日志系統的事件,
if (event instanceof ApplicationEnvironmentPreparedEvent) {
// 獲得原來的password內容
String password = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment().getProperty("spring.datasource.password");
// 進行密碼的解密
System.setProperty("spring.datasource.password", SM4Utils.encryptData_ECB(password));
}
if (event instanceof ApplicationPreparedEvent) {
}
}
@Override
public int getOrder() {
// 設定該監聽器 在加載組態檔之后執行
return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
}
}
- 并且在main方法中加入該監聽器
public class Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.addListeners(new AfterConfigListener());
springApplication.run(args);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/162474.html
標籤:Java
下一篇:Java多執行緒
