1. 程式人生 > >啟動時檢視配置檔案application.yml

啟動時檢視配置檔案application.yml

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);
    }

}