1. 程式人生 > 程式設計 >Spring Boot 在啟動時進行配置檔案加解密

Spring Boot 在啟動時進行配置檔案加解密

  • 尋找到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);
 }

}

總結

到此這篇關於Spring Boot 在啟動時進行配置檔案加解密的文章就介紹到這了,更多相關Spring Boot配置檔案加解密內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!