0

我有一个 Spring Boot 项目,我正在application.yml通过以下方式注入值application.properties(这种设计对我来说很有意义,因为有很多微服务,application.properties实际上是一个符号链接),如下所示:

application.properties

PROPERTY_YAML=something

然后在application.yml

app:
  property:
    yaml: ${PROPERTY_YAML}

这工作得很好,当我通过Environment.getProperty或通过@Value一切访问它时,一切都按预期工作。但是,当我尝试以相同的方式设置 Spring Profile 时,它​​不起作用。设置和作为SPR_PROFILE=my_profile_application.propertiesapplication.yml

spring:
  profiles:
    active: ${SPR_PROFILE}

Environment.activeProfiles当返回${SPR_PROFILE}(并且 spring 在此配置文件下运行)和属性Environment.getProperty("spring.profiles.active")返回时导致 spring 不一致my_profile

这是预期的行为吗?这是为什么?在实际解析/替换占位符之前是否加载配置文件?

我目前的解决方法是设置spring.profiles.active=my_profileapplication.properties但我想知道,为什么 spring 会这样。

4

1 回答 1

3

我无法回答具体问题,但我不会同时使用两者application.properties,并且application.yml根据Spring 文档,两者都具有相同的优先级,并且不能保证哪个首先加载:

  1. 打包 jar 之外的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML 变体)。

  2. 打包在 jar 中的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML 变体)。

  3. 打包 jar 之外的应用程序属性(application.properties 和 YAML 变体)。

  4. 打包在 jar 中的应用程序属性(application.properties 和 YAML 变体)。

我会将所有共享属性放在一个自定义*.properties文件中 - 最好使用配置文件(例如applicaion-dev.properties)并使用 Spring 的各种方式之一激活该配置文件,这应该保证在默认属性之前加载。

于 2019-11-15T14:18:41.113 回答