基于EnvironmentPostProcessor接口实现自定义配置中心

介绍:
EnvironmentPostProcessor 是 Spring Framework 中的一个接口,用于在 Spring 应用程序的环境配置加载之后,但在应用程序上下文创建之前,对环境进行进一步的自定义处理。这个接口允许开发人员在 Spring 应用程序启动时修改应用程序的环境配置。

通常,Spring 应用程序的环境配置是通过属性文件、YAML 文件、系统属性、命令行参数等方式定义的。EnvironmentPostProcessor 提供了一个扩展点,让开发人员可以在应用程序启动时动态修改这些配置,例如,可以根据运行时条件来添加、修改或删除属性值,从而实现更灵活的配置管理。

EnvironmentPostProcessor 接口的主要方法是 postProcessEnvironment,开发人员需要实现这个方法,以执行他们希望在环境配置加载后进行的自定义处理逻辑。在这个方法中,可以访问和修改应用程序的环境对象,通常是 ConfigurableEnvironment 接口的实例,这允许操作配置属性、激活的配置文件、属性源等。

使用 EnvironmentPostProcessor 可以用于各种场景,例如:

动态配置属性:根据运行时条件设置属性值。
安全性配置:根据环境或安全需求来动态配置密码、密钥等。
多租户支持:为不同租户的应用程序动态配置属性。
特定环境下的配置:根据开发、测试和生产环境的需要,动态修改配置。
EnvironmentPostProcessor 是一个高级的 Spring 功能,通常在定制化的场景中使用。要使用它,需要创建一个实现了该接口的类,并将它注册到 Spring 应用程序的配置中。然后将它的全限定类名添加到 META-INF/spring.factories 文件中。在注册后,postProcessEnvironment 方法将会在 Spring 应用程序启动时执行,允许您修改应用程序的环境配置。

postProcessEnvironment 方法是 org.springframework.boot.env.EnvironmentPostProcessor 接口中的核心方法,它接收两个参数:

ConfigurableEnvironment: 这是Spring的环境抽象,代表了应用运行时的环境配置信息。它包含了多个属性源(PropertySource),这些属性源可以来自各种不同的地方,比如 properties 文件、系统属性、环境变量、命令行参数等。ConfigurableEnvironment 允许添加、删除或修改这些属性源,从而影响应用的配置。通过这个参数,可以访问和修改应用的所有配置属性,以及决定它们的优先级。

SpringApplicationRunListeners: 这个参数代表了Spring Boot应用启动监听器的集合。它提供了应用生命周期中各个阶段的通知机制,比如开始、环境就绪、上下文初始化、应用启动完成等事件。虽然在 postProcessEnvironment 方法中,直接操作 SpringApplicationRunListeners 的情况较少,但它提供了上下文信息,理论上你可以通过它来触发额外的监听逻辑或记录日志等。

在实现 EnvironmentPostProcessor 接口时,需要覆盖 postProcessEnvironment 方法,并在这个方法体内编写自定义的逻辑来处理或修改 ConfigurableEnvironment,从而定制应用的启动环境。例如,你可以在这里添加额外的属性源,或者基于某些条件改变现有的配置值。

 @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        try {
            Map<String, Object> map = new HashMap<>();
 
            String username = environment.getProperty("spring.datasource.username");
            String password = environment.getProperty("spring.datasource.password");
            String url = environment.getProperty("spring.datasource.url").replace("/poetize", "");
            String driver = environment.getProperty("spring.datasource.driver-class-name");
            Class.forName(driver);
            try (Connection connection = DriverManager.getConnection(url, username, password)) {
                //初始化数据库
                initDb(connection);
                //加载配置文件
                try (Statement statement = connection.createStatement()) {
                    try (ResultSet resultSet = statement.executeQuery(SOURCE_SQL)) {
                        while (resultSet.next()) {
                            map.put(resultSet.getString("config_key"), resultSet.getString("config_value"));
                        }
                    }
                }
            }
            //创建一个新的MapPropertySource,并将从数据库读取到的配置信息以这个源的形式添加到环境的配置源首位。
            //这意味着从数据库中读取的配置会优先于application.properties/yml文件中的配置。
            MutablePropertySources propertySources = environment.getPropertySources();
            PropertySource<?> source = new MapPropertySource(SOURCE_NAME, map);
            propertySources.addFirst(source);
        } catch (Exception e) {
            throw new PoetryRuntimeException(e);
        }
    }

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值