【问题标题】:Creating hierarchical properties files with spring boot使用 Spring Boot 创建分层属性文件
【发布时间】:2017-07-20 08:50:15
【问题描述】:

我们的项目包含三个资源文件 - application-dev.properties application-test.propertiesapplication-prod.properties。我们有一个环境变量来设置我们所在环境的名称,然后我们使用计算占位符加载正确的属性文件,如下所示:

@Configuration
@PropertySource("classpath:application-${environment}.properties")
public class ApplicationConfiguration {

}

我希望添加一个新文件application-defaults.properties,它将具有所有默认属性,并且只有出现在application-${environment}.properties 中的属性才会被特定环境属性覆盖。我尝试这样做:

@Configuration
@PropertySource({"classpath:application-defaults.properties", "classpath:application-${environment}.properties"})
public class ApplicationConfiguration {

}

事情是,默认文件中的属性总是“赢”并优先,而我希望它们被覆盖,以防属性出现在指定的环境变量中。我尝试在它们之间切换顺序,但它仍然保持不变。我什至尝试将默认文件的名称更改为 default.properties 只是为了了解加载顺序是字典顺序还是类似的东西,但仍然 - default.properties 总是赢。

注意:为了加载我们使用 spring-boot 的应用程序。

【问题讨论】:

  • 您确定属性${environment} 在加载时已正确解析?

标签: spring properties


【解决方案1】:

如果您想要多级分层配置文件,您可以使用 spring.profiles.include 属性。

第一级中的每个配置文件都从 application.properties 扩展属性,在第二级中,您可以在第一行中设置 spring.profiles.include 以从第一级扩展。

例如:

  • 默认配置文件:

    • application.proerties
  • 一级简介:

    • application-dev.properties
    • application-prod.properties
  • 二级简介:

    • application-prod-aws.properties
    • application-prod-azure.properties
    • application-prod-openshift.properties

【讨论】:

    【解决方案2】:

    不用占位符也可以

    application.properties 中指定所有配置文件共有的属性。 在application-xxx.properties 中指定特定配置文件的属性。

    然后在application.properties 中通过spring.profiles.active: xxx 激活配置文件或添加JVM 参数-Dspring.profiles.active=xxx

    application-xxx.properties 中声明的属性将优先于application.properties 中声明的属性

    【讨论】:

      【解决方案3】:

      属性在 Spring Boot 中是分层的,下面是如何实现你想要做的:

      application.properties (or application.yml) #this file contains all default properties 
      application-dev.properties (or application-dev.yml) #contains dev properties and can override properties in application.yml
      application-prod.properties (or application-prod.yml) #same as above
      

      我个人更喜欢 .yml 扩展名,这样可以避免冗余。

      【讨论】:

        猜你喜欢
        • 2018-06-18
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 2018-03-01
        • 2014-05-16
        • 2019-06-04
        • 2020-12-12
        • 2018-08-01
        相关资源
        最近更新 更多