springboot 動態解密

最近要處理一個springboot 動態解密的操作,要在拿到配置後,創建bean之前,把yaml的密碼給解密,瞭解了一下spring 的啓動機制 
 

Spring Boot的啓動機制是一個相對複雜但又高度自動化的過程,主要包括以下幾個階段:

  1. 加載啓動類(Main Class):Spring Boot應用程序的入口是一個Java類,通常稱爲啓動類或主類。該類使用@SpringBootApplication註解標記,其中包含了main()方法,通過該方法啓動應用程序。

  2. 創建Spring應用程序上下文:在啓動類的main()方法中,會創建Spring應用程序上下文(ApplicationContext)。Spring Boot使用自動配置機制,根據類路徑、依賴和各種條件自動配置應用程序上下文,以便儘可能地簡化配置。

  3. 執行自動配置:Spring Boot根據應用程序的類路徑和依賴,自動配置各種組件,包括Web服務器、數據庫連接池、日誌系統等。這些自動配置是通過條件化的配置類和自動配置類實現的,使得開發人員不需要手動配置大部分常用的組件。

  4. 掃描組件:Spring Boot會掃描應用程序中的各種組件,包括控制器、服務、存儲庫等,並將它們註冊到應用程序上下文中,以便在運行時進行管理和使用。

  5. 啓動Web服務器:如果應用程序是一個Web應用程序,Spring Boot會自動啓動內嵌的Web服務器,如Tomcat、Jetty或Undertow,並將應用程序部署到該服務器中。

  6. 加載配置:Spring Boot會加載應用程序中的配置文件,包括application.propertiesapplication.yml等,並將配置項加載到應用程序上下文中。

  7. 執行初始化操作:Spring Boot會執行一些初始化操作,如註冊ServletContextListener、初始化數據庫連接池等。

  8. 啓動應用程序:最後,Spring Boot會啓動應用程序,並開始處理請求或執行其他業務邏輯

 

在加載配置後、初始化之前修改YAML的值可能會稍微複雜,因爲Spring Boot加載配置文件後,初始化過程是由Spring框架控制的,通常情況下不會直接暴露接口來修改已加載的配置。然而,您仍然可以通過一些技巧來實現這樣的需求。

一種常見的方法是使用EnvironmentPostProcessor接口。EnvironmentPostProcessor允許在Spring應用程序上下文創建之前對應用程序的環境進行修改。通過實現EnvironmentPostProcessor接口,您可以在加載配置文件後修改配置值,然後將修改後的配置值應用到應用程序上下文中。

以下是一個簡單的示例,演示瞭如何使用EnvironmentPostProcessor來修改YAML文件中的配置值: 

import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

@Component
public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        // 獲取當前環境中的配置屬性
        String propertyValue = environment.getProperty("my.property");
        
        // 修改配置屬性的值
        if (propertyValue != null) {
            propertyValue = "new-value"; // 修改爲新的值
            // 將修改後的值添加到環境中
            Map<String, Object> newProperties = new HashMap<>();
            newProperties.put("my.property", propertyValue);
            environment.getPropertySources().addLast(new MapPropertySource("custom-config", newProperties));
        }
    }
}

 

在這個示例中,CustomEnvironmentPostProcessor類實現了EnvironmentPostProcessor接口,並在postProcessEnvironment()方法中對環境進行了修改。具體地,它檢查了配置文件中是否存在名爲my.property的屬性,並將其修改爲新值"new-value"。然後,使用MapPropertySource將修改後的值添加到環境中。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章