覆盖多个弹簧活动配置文件的属性值

Posted

技术标签:

【中文标题】覆盖多个弹簧活动配置文件的属性值【英文标题】:Override property value from multiple spring active profile 【发布时间】:2017-09-24 00:55:56 【问题描述】:

我有一个包含 application.yml 的 Spring Boot 应用程序。

application.yml 的内容:

spring:
  profiles:
    active: default,private
integrations:
  ecom:
    api-url: http://localhost:8080/com

application-private.yml 的内容:

integrations:
  ecom:
    api-url: http://testenv:8080/com

据我了解,integrations:ecom:api-url 是从 application-private.yml 加载的,即使默认配置文件也具有相同的属性。

如果两个配置文件处于活动状态,是否会按照配置文件指定的顺序加载和使用属性?

我的订单:

-Dspring.profiles.active="default,private"

提前致谢。

【问题讨论】:

这似乎很容易让您测试和发现。是否正在发生某些事情让您相信它们是按此顺序阅读的? 你为什么不试一试...... 为了更清楚地从 application.yml 中删除该属性。如果它是特定于配置文件的,为什么不把它放在 application-profile.yml 中? 我试了试。属性正在从 application-private.yml 加载。谢谢 【参考方案1】:

对于您的示例,以下是 Spring 将获取属性值的优先顺序(从最高到最低优先级):

    application-private.yml 在您的 jar 文件外部提供(例如,通过 spring-cloud-config) application.yml 您的 jar 文件之外提供(application.yml 等同于 application-default.yml) application-private.yml 提供你的 jar 文件 application.yml 提供你的 jar 文件

因此,如果您的 jar 文件中有 application-private.yml 和 application.yml,则前者中的属性会覆盖后者中的属性。

但是,如果 application-private.yml 在 jar 内部,而 application.yml 在外部,则后者将覆盖前者。

见official documentation about external property precedence.

【讨论】:

【参考方案2】:

在这种情况下,将首先加载 application.yml 中的所有属性,然后再加载 application-private.yml 将根据配置文件加载,从而覆盖 application.yml

中的属性

【讨论】:

其实看yml文件是从boot app jar文件里面还是外面加载的。

以上是关于覆盖多个弹簧活动配置文件的属性值的主要内容,如果未能解决你的问题,请参考以下文章

如何强制弹簧只有一个活动配置文件?

如何使用 Maven 配置文件设置弹簧活动配置文件

当特定的弹簧配置文件处于活动状态时,如何防止运行测试?

使用 bootWar 设置活动弹簧配置文件

如何从环境变量中添加活动弹簧配置文件?

在 docker 中使用 gradle 设置活动弹簧配置文件没有任何效果