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.properties
和 application-prod.properties
文件都已加载,后一个(生产)中的同名键会覆盖前一个。
【讨论】:
【参考方案3】:我发布了关于配置文件订单处理的重要通知。看看这个进程是如何处理jar资源文件的here。
【讨论】:
以上是关于Spring Profiles 应用程序属性顺序的主要内容,如果未能解决你的问题,请参考以下文章
spring.profiles.include 来自 spring 云配置的属性
从位置“类路径资源 [application-dev.yml]”导入的属性“spring.profiles.active”无效
spring boot 配置属性 之 spring.profiles.include