我目前正在使用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中,则该配置文件似乎尚未注入环境中,并且尚未注入由environment.getActiveProfiles()返回。我尝试使用优先级最低的接口Ordered,但这无济于事。
要在我要实现的目标周围添加一些上下文,该类在一个小的库中,该库添加了外部属性源(如数据库)。然后,我们可以在其他一些Spring Boot应用程序中使用它。像Spring Cloud Config一样。
我想要一种干净的方法来启用或禁用此属性源,具体取决于代码运行的环境。我不介意使用其他任何东西,然后再使用概要文件,甚至不使用其他方式来注入属性源,我只想要一些不受几个因素影响的干净东西。
当前代码中的主要问题是我正在使用spring boot's property sources来配置自己的属性源。
更新:我使用Spring Cloud应用程序对其进行调试,并将引导程序上下文与常规的Spring Boot上下文混淆了。请参阅下面的答案。
答案 0 :(得分:1)
进一步的调查使我发现问题仅出现在Spring Cloud应用程序中。
实际上,我在此代码中遇到的断点被触发两次,一次是在引导上下文初始化之后,一次是在Spring Boot上下文初始化之后。我只是在第一次出现时调试配置文件。那时,仅加载bootstrap.yml属性,而不加载application.yml文件中的属性。显然,第二次出现具有我的application.yml文件中的配置文件。
我的代码在普通的Spring Boot应用程序中按预期工作。正如documentation所述:
环境已经准备好所有常规属性 Spring Boot默认加载的资源。
我对我的应用程序的行为感到困惑,该行为似乎与该语句有所不同,但正是Spring Cloud的引导程序使我的调试陷入困境。
由于我需要具有最高优先级的PropertySource,因此需要将其添加到Spring Cloud应用程序的启动后初始化中。我在EnvironmentPostProcessor上使用了一个初始化标志,因此不会被执行两次,并在Spring Cloud应用程序上使用了bootstrap.yml来设置配置文件。
TL; DR: 使用Spring Cloud,两次调用EnvironmentPostProcessor:一次在引导初始化之后,一次在常规Spring Boot上下文初始化之后。如果需要注入的属性并针对Spring Cloud的引导后初始化,请使用bootstrap.yml而不是application.yml。