Spring Boot 在啟動時進行配置文件加解密


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 的實現方式
  • 刪除一下不需要處理的操作(大概就是以下代碼) 並且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);
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM