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将修改后的值添加到环境中。

 

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