Spring Profiles应用程序属性顺序

时间:2018-07-27 20:52:36

标签: spring spring-boot properties

我们有许多环境具有多个活动的Spring配置文件,但是应用程序{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?看来可能有。

3 个答案:

答案 0 :(得分:6)

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

此行为适用于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

答案 1 :(得分:0)

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

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

@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文件,并且后一个(生产环境)中具有相同名称的键将覆盖前一个。

答案 2 :(得分:0)

我发布了关于配置文件订单处理的重要通知。了解在此过程here中如何处理jar资源文件。