gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:06:13 25 4
gpt4 key购买 nike

我目前正在使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com