java - 在 Spring Boot 应用程序中添加条件外部 PropertySource

标签 java spring spring-boot spring-cloud

我目前正在使用EnvironmentPostProcessor来添加我的外部PropertySource,代码如下所示:

public class ExternalPropertySourceEnvironmentPostProcessor implements EnvironmentPostProcessor
{
    private static final String EXTERNAL_PROPERTY_SOURCE_NAME = "ExternalPropertySource";

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application)
    {
        if (environment.acceptsProfiles(Profiles.EXTERNAL_PROPERTY_SOURCE_ENABLED_PROFILE)) {
            environment.getPropertySources()
                       .addLast(new ExternalPropertySource(EXTERNAL_PROPERTY_SOURCE_NAME, new ExternalSource()));
        }
    }
}

spring.factories也用于注册这个EnvironmentPostProcessor。

如果在 vm 环境变量中设置了配置文件,此代码实际上可以工作,但如果将其添加到 src/main/resources/application.yml 中,则该配置文件似乎尚未注入(inject)到环境中,并且没有由environment.getActiveProfiles()返回。我尝试过使用具有最低优先级的 Ordered 接口(interface),但没有帮助。

为了围绕我想要实现的目标添加一些上下文,此类位于一个小型库中,该库添加了诸如数据库之类的外部属性源。然后我们就可以在其他一些Spring Boot应用程序中使用它了。像 Spring Cloud Config 那样的东西。

我想要一种干净的方法来根据代码运行的环境启用或禁用此属性源。我不介意使用配置文件之外的其他东西,甚至使用其他方式来注入(inject)属性源,我只是想要一些干净的东西,不依赖于多个因素来工作。

我的代码现在的主要问题是我正在使用 spring boot's property sources使我自己的属性源可配置。

更新:我使用 Spring Cloud 应用程序来调试它,并且将引导上下文与正常的 Spring 引导上下文混淆了。请参阅下面我的回答。

最佳答案

进一步的调查让我发现问题只出现在 Spring Cloud 应用程序中。

事实上,我在这段代码中的断点被触发了两次,一次是在引导上下文初始化之后,一次是在 Spring Boot 上下文初始化之后。我只是在第一次出现时调试配置文件。此时,仅加载 bootstrap.yml 属性,而不加载 application.yml 文件中的属性。第二次出现显然有我的 application.yml 文件中的配置文件。

我的代码在普通 Spring Boot 应用程序中按预期工作。作为documentation状态:

The Environment has already been prepared with all the usual property sources that Spring Boot loads by default.

我对我的应用程序的行为感到困惑,它似乎与该声明不同,但 Spring Cloud 的 Bootstrap 扰乱了我的调试。

由于我需要一个具有最高优先级的 PropertySource,因此我需要将其添加到 Spring Cloud 应用程序的引导后初始化中。我在 EnvironmentPostProcessor 上使用了 init 标志,因此它不会执行两次,并在 Spring Cloud 应用程序上使用 bootstrap.yml 来设置配置文件。

TL;博士: 使用 Spring Cloud,EnvironmentPostProcessor 会被调用两次:一次在引导初始化之后,一次在正常的 Spring Boot 上下文初始化之后。如果您需要注入(inject)属性并且目标是 Spring Cloud 的引导后初始化,请使用 bootstrap.yml 而不是 application.yml。

关于java - 在 Spring Boot 应用程序中添加条件外部 PropertySource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50935915/

相关文章:

spring - 将 applicationContext 拆分为多个文件

java - 为什么要在模型上实现 Serializable?

java - jtapi - 获取调用者和调用者的 IP 地址和端口

java - 复制 Jtree

spring - 如何使用@DataJpaTest 测试我的自定义 JPA 查询?

java - 无法在 Spring Boot 中的模型级别解析来自属性文件的消息

java - 在 spring boot yml 文件中添加自定义 logback 日志模式

java - 如何分割这个值31.07?

java - SOAP 到 REST 转换 : Fresh or reuse?

java - 设置类路径资源