news 2026/5/12 17:05:46

Spring Boot 配置文件优先级详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot 配置文件优先级详解

Spring Boot 配置文件优先级详解

你希望全面了解Spring Boot配置文件的优先级规则,我会从配置格式、内部文件路径、外部配置来源、特殊规则四个维度展开,结合实操示例帮你彻底掌握。

一、前置基础:配置文件格式优先级

Spring Boot核心支持两种配置文件格式,同一目录下的优先级关系为:

.properties(键值对格式) >.yml(层级格式)

说明:

  1. .properties格式:语法为key=value,无缩进要求,兼容性更强(示例:server.port=8080
  2. .yml格式:语法为key: value(冒号后必须加空格),层级依赖缩进(2个空格,禁止tab),可读性更强(示例:server: port: 8080
  3. 若同一目录下同时存在application.propertiesapplication.yml,两者相同配置项以.properties为准,不同配置项会自动合并。

二、核心优先级1:项目内部配置文件路径(从高到低)

Spring Boot会自动扫描4个默认内部路径的配置文件(文件名固定为applicationapplication-{profile},如application-dev.properties),路径优先级从高到低排序如下:

优先级路径说明
1./config/项目根目录下的config子目录(打包后对应jar包同级的config文件夹)
2./项目根目录(打包后对应jar包同级目录)
3classpath:/config/类路径下的config子目录(项目中对应resources/config/目录)
4classpath:/类路径根目录(项目中对应resources/目录,默认配置存放位置,优先级最低)

实操示例:

若同时存在以下4个配置文件,均配置了server.port

  1. ./config/application.propertiesserver.port=8080
  2. ./application.propertiesserver.port=8081
  3. classpath:/config/application.propertiesserver.port=8082
  4. classpath:/application.propertiesserver.port=8083

最终项目启动端口为8080(遵循路径优先级从高到低)。

三、核心优先级2:外部配置来源(高于所有内部配置)

除了项目内部配置文件,Spring Boot还支持多种外部配置来源,其优先级整体高于内部配置文件,从高到低排序如下:

1. 命令行参数(优先级最高)

启动jar包时通过--key=value传递的参数,会覆盖所有其他配置来源。
示例:

# 无论内部配置端口是多少,最终端口为8090java-jarspring-boot-demo.jar--server.port=8090

2. JVM系统属性

启动时通过-Dkey=value传递的JVM参数,优先级仅次于命令行参数。
示例:

# 端口配置为8091,若与命令行参数冲突,以命令行为准java-Dserver.port=8091-jarspring-boot-demo.jar

3. 操作系统环境变量

操作系统级别的环境变量(Windows“环境变量”/Linuxexport命令配置),优先级高于配置中心和外部指定配置文件。
说明:

  • Spring Boot会自动转换命名规则:驼峰转下划线、小写转大写,示例:
    配置项spring.profiles.active对应环境变量SPRING_PROFILES_ACTIVE
  • Linux示例:
    # 配置激活prod环境exportSPRING_PROFILES_ACTIVE=prodjava-jarspring-boot-demo.jar

4. 分布式配置中心(Nacos/Consul/Spring Cloud Config)

分布式场景下的统一配置管理,优先级高于本地外部配置文件,适合多实例统一配置。
说明:配置中心的配置可动态刷新,优先级可通过配置调整(默认高于本地所有配置)。

5. 外部指定路径配置文件

通过spring.config.locationspring.config.additional-location指定外部配置文件路径,优先级高于项目内部配置文件。
两者区别:

  • spring.config.location覆盖默认配置路径(内部4个路径失效,仅加载指定路径配置)
  • spring.config.additional-location追加配置路径(保留默认4个路径,指定路径优先级更高,推荐使用)
    示例:
# 追加/opt/config/目录下的配置文件,优先级高于内部配置java-jarspring-boot-demo.jar --spring.config.additional-location=/opt/config/

四、特殊优先级规则

1. Profile配置文件的覆盖规则

Spring Boot支持环境隔离配置(application-{profile}.properties/yml),其优先级规则:

  • 激活的Profile配置 > 默认配置(application.properties/yml
  • 多个Profile激活时(通过spring.profiles.active=dev,test指定),后面的Profile会覆盖前面的相同配置项,不同配置项合并
  • Profile配置同样遵循「路径优先级」和「格式优先级」

示例:

  1. classpath:/application.propertiesserver.port=8080spring.application.name=demo
  2. classpath:/application-dev.propertiesserver.port=8081spring.datasource.url=xxx
  3. classpath:/application-test.propertiesserver.port=8082
  4. 激活命令:--spring.profiles.active=dev,test

最终配置:

  • server.port=8082(test覆盖dev,dev覆盖默认)
  • spring.application.name=demo(默认配置,无覆盖)
  • spring.datasource.url=xxx(dev配置,无覆盖)

2. 配置项的核心原则:“覆盖+合并”

  • 覆盖:相同配置项,高优先级来源覆盖低优先级来源(如命令行覆盖内部配置)
  • 合并:不同配置项,所有来源的配置项会统一加载,不会丢失(如内部配置了server.port,外部配置了spring.application.name,两者同时生效)

3. 自定义配置文件(@PropertySource)

通过@PropertySource注解加载自定义配置文件(如custom.properties),其默认优先级低于所有Spring Boot默认配置来源,可通过order属性调整优先级(值越小,优先级越高)。
示例:

// 加载自定义配置文件,指定优先级(默认最低)@SpringBootApplication@PropertySource(value="classpath:custom.properties",order=10)publicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}

五、优先级总览(从高到低,核心总结)

  1. 命令行参数(--key=value
  2. JVM系统属性(-Dkey=value
  3. 操作系统环境变量
  4. 分布式配置中心(Nacos/Consul等)
  5. 外部指定路径配置(spring.config.additional-location>spring.config.location
  6. 项目根目录./config/下的配置文件(.properties>.yml
  7. 项目根目录./下的配置文件(.properties>.yml
  8. 类路径classpath:/config/下的配置文件(.properties>.yml
  9. 类路径classpath:/下的配置文件(.properties>.yml,默认存放位置)
  10. @PropertySource加载的自定义配置文件(默认最低)

六、常见误区提醒

  1. 误区1:认为.yml优先级高于.properties→ 实际同一目录下.properties优先级更高
  2. 误区2:多个Profile激活时忽略顺序 → 后面的Profile会覆盖前面的相同配置
  3. 误区3:滥用spring.config.location→ 会覆盖默认配置路径,推荐使用spring.config.additional-location追加配置
  4. 误区4:忽略命令行参数的最高优先级 → 线上调试时可通过命令行快速覆盖配置,无需修改配置文件

总结

  1. 核心优先级逻辑:外部配置 > 内部配置properties > yml特定路径 > 默认路径Profile配置 > 默认配置
  2. 最高优先级是命令行参数,最低优先级默认是@PropertySource自定义配置
  3. 配置冲突时遵循“覆盖原则”,配置不冲突时遵循“合并原则”
  4. 线上部署时,优先通过spring.config.additional-location指定外部配置文件,方便修改无需重新打包
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 21:47:47

液压冲镦机电气原理图

镦台上料部分 输入 回原点 伺服电机前进 后退 X0 阀门油缸 上升 下降 X1 X2 夹紧松开 气缸 X3 X4 上下限位 X5 X6 高度检测 AD0 急停开关 X10 输出 伺服电机 前进 后退 脉冲 Y0 Y3 阀门 脉冲 Y1 Y4 旋转 脉冲 Y2 Y5 减速电机 Y6 Y7 膨胀轴 Y10 压力速度 DA0 DA1 机械手取料部分…

作者头像 李华
网站建设 2026/5/11 10:06:03

GitHub标签系统整理TensorFlow项目里程碑

GitHub标签系统整理TensorFlow项目里程碑 在AI工程化落地日益深入的今天,一个常见的开发困境始终困扰着团队:为什么同一段代码,在A的机器上能跑通,到了B的环境却报错?问题往往不在于算法本身,而在于“环境差…

作者头像 李华
网站建设 2026/5/9 17:06:21

TensorFlow-v2.9镜像内置了哪些优化过的CUDA驱动?

TensorFlow-v2.9 镜像中的 CUDA 加速体系解析 在现代深度学习工程实践中,一个常见的痛点是:明明买了高性能 GPU,却因为环境配置问题迟迟跑不起训练任务。ImportError: libcudart.so.11.0 not found、UnknownError: Failed to get convolution…

作者头像 李华
网站建设 2026/5/9 4:58:18

向量API性能调优的7个致命误区:90%的开发者第3个就踩坑

第一章:向量API性能调优的认知重构现代JVM平台上的向量API(Vector API)为开发者提供了在Java中编写高性能并行计算代码的能力。它通过将标量运算转换为SIMD(单指令多数据)操作,显著提升数值密集型任务的执行…

作者头像 李华
网站建设 2026/5/9 6:42:37

transformer模型详解之Sparse Attention稀疏注意力机制

Transformer模型中的稀疏注意力机制:从理论到实践 在当今深度学习领域,处理超长序列已经成为一项普遍挑战。无论是分析长达数万字符的法律合同、整篇科研论文,还是建模基因组级别的DNA序列,传统Transformer模型都面临着一个无法回…

作者头像 李华
网站建设 2026/5/9 7:38:56

AtCoder Beginner Contest竞赛题解 | 洛谷 AT_abc438_c 1D puyopuyo

​欢迎大家订阅我的专栏:算法题解:C与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选…

作者头像 李华