Spring Profiles 应用程序属性顺序

18

我们有很多环境都拥有多个活跃的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自动配置在Profiles上的顺序/优先级的重复问题。 - Oleg Estekhin
3个回答

40

配置文件中的属性按照您指定的顺序加载,如果不同的配置文件中定义了相同的属性,则最后一个属性将覆盖之前的属性。

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

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

假设您有profile1和profile2,并且有以下属性文件:

application.yml:

property1: bob
property2: alice
property3: eve

应用程序配置文件1.yml:

property2: alice1
property3: eve1

应用程序配置文件2.yml:

property3: eve2

你可以通过以下方式启动应用程序:spring.profiles.active=profile1, profile2

你将获得:

property1: bob
property2: alice1
property3: eve2

5
在application.yaml中提供的属性(文件)将覆盖打包在jar包中的application-{profile}.yaml 中同名的属性。这个规则特别重要,如果你使用spring-cloud-config的话,详见外部属性优先级官方文档。但并非总是如此。 - Paulo Merson

3

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

另一方面,SpringApplicationBuilderprofiles方法则添加到现有的活跃配置文件中。我们可以使用以下代码来确定最终的活跃配置文件集合:

@Autowired
private Environment environment;

...

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

现在我们需要考虑Spring文档所称的后者覆盖前者策略

如果指定了多个配置文件,则采用后者覆盖前者策略。

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

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

同时加载了application-dev.propertiesapplication-prod.properties文件,后者(生产环境)中与前者相同名称的键将覆盖前者。


0

我在档案订单处理中发布了重要通知。请查看此过程中如何处理jar资源文件这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接