使用spring.profiles.include包含配置文件似乎会覆盖而不是包含



我正在尝试对几个Spring Boot应用程序的配置属性进行分区。我使用的是SpringBoot1.1.6,我们的配置属性在YAML中以通常的application.yml样式表示。我已经为通用的基本参数、通用的DB参数等创建了各种配置文件。我试图使用Spring Boot参考文档中提到的include功能,但它似乎是一种覆盖,而不是include。也就是说,与我想要的恰恰相反。鉴于application.yml中的以下内容,当bar配置文件处于活动状态时,我本希望属性name的值为bar,但它却被设置为foo(来自包含的配置文件)。我认为include的概念意味着它是首先加载的,并且在新配置文件中设置的任何同名属性都会覆盖include配置文件中的属性。有点像,如果一个子类正在从超类阴影化一个字段,那么该子类的任何实例都会反映阴影化的值。这是文件:

spring:
  profiles: foo
name: foo
--- # New YAML doc starts here
spring:
  profiles: 
    include: foo
  profiles: bar
name: bar

如果我在"bar"配置文件显式激活的测试用例中运行这个,name属性仍然是foo:

SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
SpringApplication app = builder.application();
builder.profiles("bar");
ConfigurableApplicationContext ctxt = app.run();
String name = ctxt.getEnvironment().getProperty("name"); // Is always "foo" much to my surprise

然而,如果我评论掉包括:

spring: 
profiles: bar
#  profiles: 
#    include: foo

并在我的代码中明确激活两个配置文件:

builder.profiles("foo", "bar");

然后它按我的预期工作,并且name属性设置为bar。我更愿意处理YAML文件中的includes的主要原因是它对我的实际代码影响较小,并且我可以在一个地方管理所有概要文件的includes。使用另一种方法,如果我要重命名概要文件,我必须在整个项目中搜索概要文件字符串和可能的@profile注释。这肯定更容易出错。我认为一个更灵活的解决方案是能够明确表示包含的配置文件是否覆盖子配置文件值。也许类似于:

spring:
  profiles: bar
  profiles:
    include: foo
      override: false

也许我只是错过了什么。有更好的方法吗?谢谢

请尝试以下操作,使foo包含但覆盖bar,这似乎适用于我的解决方案

spring:
    profiles:
        include: bar
        active: foo,bar

编辑:请注意,这是一个"黑客",不受官方支持,适用于2016版本

最新更新