以编程方式添加活动配置文件后,@ ConfigurationProperties重新加载

时间:2018-07-25 02:02:16

标签: java spring spring-boot javabeans configurationproperties

我有一个用@ConfigurationProperties注释的类。

@ConfigurationProperties
@Configuration
@DependsOn("AddDefaultProfile")
public class MyProperties(){
 ....
}

我有几个chrome, safari, ie, and en_US, fr_CA等个人资料。 我正在运行的参数看起来像-Dspring.profiles.active=chrome, en_US

现在,我要检查是否指定了语言,如果没有指定,请使用environment.addActiveProfile("en_US")向其中添加默认语言。 问题是我的MyProperties无法重新加载。 通过调试它,我可以看到环境在活动配置文件中具有en_US,但是propertySource仍然具有旧的配置文件。

如何使用新的个人资料重新加载MyProperties。

2 个答案:

答案 0 :(得分:0)

您可以尝试调用此方法WebApplicationContextUtils#initServletPropertySources(org.springframework.core.env.MutablePropertySources, javax.servlet.ServletContext, javax.servlet.ServletConfig),但我不确定该方法是否有用

答案 1 :(得分:0)

在春季靴子中,还有其他一些东西:

  • application.properties(无论如何加载)
  • application-abc.properties(仅在配置文件abc处于活动状态时加载)

这些是可以找到实际值的源文件。

@ConfigurationProperties意味着在找到所有要加载的相关文件之后,如何“准备” spring-boot读取的实际键值以在应用程序中使用(例如,注入标记为的Bean) @ConfigurationProperties等)

所以,我想,您应该将默认设置仅放在application.properties中,并将特定内容配置到application-<profile>.properties

特定于个人资料的内容始终优先于默认内容,因此您将获得以下内容:

  • 未指定配置文件时,将加载 application.properties 中的内容
  • 指定配置文件后,即使在 application.properties 文件
  • 中定义了相同的属性键,也会从application-<profile>.properties加载实际值

说了另一种方法是始终使用配置文件,只需定义一个默认配置文件并显式加载它(--spring.profiles.active = default)并将您的内容保存在 application-default.properties

如果您想通过检查其他配置文件不存在来以编程方式定义活动配置文件,则可以实施EnvironmentPostProcessor,但它已经是相当高级的东西