啟動時查看配置文件application.yml
- 2020 年 3 月 2 日
- 筆記
Spring Boot Application 事件和監聽器
- 在多環境的情況下。 可能需要切換配置文件的一個對應的屬性來切換環境
- 面臨的問題就是 如何在springboot加載完配置文件的時候就可以立即校驗對應的屬性值
SmartApplicationListener實現監聽解耦
- 我們只需在加載完成之後去加入一個監聽器。 就可以得到application.yml的內容。 不然再這個事件之前。都是拿不到對應的內容的
一、SmartApplicationListener介紹
- Spring ApplicationEvent以及對應的Listener提供了一個事件監聽、發佈訂閱的實現,內部實現方式是觀察者模式,可以解耦業務系統之間的業務,提供系統的可拓展性、復用性以及可維護性。
- 在application.yml文件讀取完會觸發一個事件ConfigFileApplicationListener 該監聽器實現文件的讀取。
- SmartApplicationListener是高級監聽器,是ApplicationListener的子類,能夠實現有序監聽
- SmartApplicationListener提供了兩個方法:
/** * 指定支持哪些類型的事件 */ boolean supportsEventType(Class<? extends ApplicationEvent> var1); /** * 指定支持發生事件所在的類型 */ boolean supportsSourceType(Class<?> var1);
二、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 { 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) { String banks = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment().getProperty("spring.name"); if (ToolUtil.isEmpty(BankEnum.getValue(banks))) { throw new RuntimeException("請檢查 com.enums.BankEnum 中是否擁有該banks環境名字!"); } } if (event instanceof ApplicationPreparedEvent) { } } @Override public int getOrder() { // 寫在加載配置文件之後 return ConfigFileApplicationListener.DEFAULT_ORDER + 1; } }
- 並且在main方法中加入該監聽器
public class XProApplication { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(XProApplication.class); springApplication.addListeners(new AfterConfigListener()); springApplication.run(args); } }