Spring Profiles 应用程序属性顺序

Posted

技术标签:

【中文标题】Spring Profiles 应用程序属性顺序【英文标题】:Spring Profiles application properties order 【发布时间】:2019-01-05 00:26:34 【问题描述】:

我们有许多具有多个活动 Spring 配置文件的环境,但是 application-profile.yml 文件的优先级是什么?

如果我有spring.profiles.active=test-us-west-2-p1, test-us-west-2, test

文件application-test.yml, application-test-us-west-2.yml, application-test-us-west-2-p1.yml 以什么顺序加载?如果我在每个文件中都有相同的属性,哪个“获胜”?

另外,这是否从 Spring-Boot 1.5.x 更改为 2.x?好像有。

【问题讨论】:

Spring Autoconfig order/precedence on Profiles的可能重复 【参考方案1】:

配置文件的属性按照您指定的顺序加载,如果相同的属性在不同的配置文件中定义,则最后一个获胜。

这种行为适用于 Spring Boot 1.5.x 和 2.x 版本,如果我没记错的话,它适用于所有版本的 Spring。

Spring 总是加载 appication.yml。之后,如果指定了某个配置文件,它将加载该配置文件的属性文件。如果在该配置文件之后指定了另一个配置文件,它将加载该配置文件的属性文件。总是用新的属性覆盖当前属性的值。

所以,假设您有 profile1 和 profile2。你有这些属性文件:

application.yml:

property1: bob
property2: alice
property3: eve

application-profile1.yml:

property2: alice1
property3: eve1

application-profile2.yml:

property3: eve2

然后你开始你的应用程序:spring.profiles.active=profile1, profile2

你会得到:

property1: bob
property2: alice1
property3: eve2

【讨论】:

并不总是。在应用程序 jar 文件外部提供的 application.yaml 中的属性将覆盖打包在 jar 中的 application-profile.yaml 中的同名属性。如果您使用的是 spring-cloud-config,则此规则尤其重要。见official doc about external property precedence。【参考方案2】:

首先,我们需要找出所有活动配置文件的最终集合。有多种方法可以设置/替换活动配置文件以及在现有活动配置文件之上添加活动配置文件。例如,使用spring.profiles.active 属性设置的活动配置文件将替换为-Dspring.profiles.active 命令行选项。 (这会变得非常复杂。)

另一方面,SpringApplicationBuilder's profiles 方法会添加到现有的活动配置文件中。我们可以使用以下代码找出最终的活动配置文件集:

@Autowired
private Environment environment;

...

System.out.println("Active profiles: " +
        Arrays.toString(environment.getActiveProfiles()));

现在我们必须考虑 Spring 文档所称的last-wins strategy

如果指定了多个配置文件,则应用最后获胜的策略。

所以,如果我们排除以下代码并排除所有其他选项:

new SpringApplicationBuilder(Application.class)
        .profiles("dev", "prod")
        .run(args);

application-dev.propertiesapplication-prod.properties 文件都已加载,后一个(生产)中的同名键会覆盖前一个。

【讨论】:

【参考方案3】:

我发布了关于配置文件订单处理的重要通知。看看这个进程是如何处理jar资源文件的here。

【讨论】:

以上是关于Spring Profiles 应用程序属性顺序的主要内容,如果未能解决你的问题,请参考以下文章

spring.profiles.include 来自 spring 云配置的属性

从位置“类路径资源 [application-dev.yml]”导入的属性“spring.profiles.active”无效

spring boot 配置属性 之 spring.profiles.include

为啥在测试类中设置的 spring.profiles.active 在实际测试类的环境属性中不可用?

源码解读 Spring Boot Profiles

spring.profiles.active和spring.profiles.include的使用与区别