SpringBoot 中属性文件、YAML 文件和命令行参数之间的优先顺序

Posted

技术标签:

【中文标题】SpringBoot 中属性文件、YAML 文件和命令行参数之间的优先顺序【英文标题】:Precedence order among properties file, YAML file, and Command Line arguments in SpringBoot 【发布时间】:2018-01-31 00:24:30 【问题描述】:

我在 Spring 应用程序中一直在使用 application.properties 文件。但最近我遇到了application.yaml 文件。三者之间的优先顺序是什么以及使用个人的优势(如果有的话)。

我知道这可能是个愚蠢的问题。但我对它们的用法感到困惑。

【问题讨论】:

希望您现在清楚我的回答。简单来说,如果你有 yaml 和 properties 文件,并且两者都有相同的 key,那么 spring boot 将首先在 properties 中查找,如果没有找到,则会转到 yaml。 【参考方案1】:

简单来说,

如果你有 yaml 和 properties 文件,并且两者都有相同的 key,那么 spring boot 将首先在 properties 中查找,如果没有找到,则会转到 yaml。

【讨论】:

虽然接受的答案是正确的,但实际上缺少这个事实 感谢@Tarnschaf 真的不确定原因.. 我觉得属性文件优先。 是的,我们都在使用(yml 在 Git 中,我们使用 git-ignored 属性来存储我们的个人数据库凭据),它似乎像你描述的那样工作。 如果我有两个包含同名属性的同名属性文件(例如abc.properties)会怎样? 我们不能在同一位置有 2 个同名的道具文件@AnthonyKong【参考方案2】:

Spring Boot 属性解析属性顺序描述here。

不希望使用application.properties application.yaml。使用一种格式或另一种格式,但不能同时使用两种格式。无论您使用哪一个,都将按属性优先顺序在位置 12 或 13(取决于文件是否打包在应用程序 JAR 中)处理。

在此处包含上述链接的摘录以避免链接失效...

Spring Boot 使用一个非常特殊的 PropertySource 顺序,旨在允许明智地覆盖值。属性按以下顺序考虑:

    您的主目录上的 Devtools 全局设置属性(当 devtools 处于活动状态时为 ~/.spring-boot-devtools.properties)。 您的测试中的@TestPropertySource 注释。 @SpringBootTest#properties 注释属性添加到您的测试中。 命令行参数。 来自 SPRING_APPLICATION_JSON 的属性(嵌入在环境变量或系统属性中的内联 JSON) ServletConfig 初始化参数。 ServletContext 初始化参数。 来自 java:comp/env 的 JNDI 属性。 Java 系统属性 (System.getProperties())。 操作系统环境变量。 仅具有随机属性的 RandomValuePropertySource。*。 打包 jar 之外的特定于配置文件的应用程序属性(application-profile.properties 和 YAML 变体) 打包在您的 jar 中的特定于配置文件的应用程序属性(application-profile.properties 和 YAML 变体) 打包 jar 之外的应用程序属性(application.properties 和 YAML 变体)。 应用程序属性打包在您的 jar 中(application.properties 和 YAML 变体)。 @Configuration 类上的@PropertySource 注释。 默认属性(使用 SpringApplication.setDefaultProperties 指定)。

【讨论】:

谢谢@Glitch,你说得这么清楚。这真的很有帮助。您的解释超出了我的预期。 @MAC 很高兴它有帮助 Spring Boot 文档提到了 2021 年的优先顺序:“建议在整个应用程序中坚持使用一种格式。如果您在同一位置有 .properties 和 .yml 格式的配置文件, .properties 优先。”如上所述,命令行提供的属性优先于两者。

以上是关于SpringBoot 中属性文件、YAML 文件和命令行参数之间的优先顺序的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot02--将application.yaml配置文件中的属性和组件中的属性进行绑定

SpringBoot对于yaml的详细学习和三种属性赋值的实战详解

springBoot:Properties和YAML配置文件

springboot项目中PropertySource读取yaml配置文件

SpringBoot配置文件(热部署Properties和YAML自定义属性对象集合)

SpringBoot 使用 @Value 从 YAML文件读取属性