当前位置: 首页 > news >正文

springboot各种配置文件及位置的优先级是什么

Spring Boot 配置优先级这块,得拆成位置优先级格式优先级两条线看,再加一条外部化配置源优先级(命令行、环境变量等凌驾于文件之上)。2.4 版本是个分水岭,加载逻辑改过,下面按最新(2.4+)讲,再标老版本差异。

一、位置优先级(同格式下,由高到低)

四个扫描位置,由外向内、由 config 向根:

优先级位置写法说明
1(最高)项目根目录下config/file:./config/jar 同目录的 config 子目录,运维最爱
2项目根目录file:./jar 同目录
3classpath 下config/classpath:/config/resources/config/
4(最低)classpath 根classpath:/resources/下默认位置

规则:高优先级覆盖低优先级的同名配置,不同名的互补加载

举个例子,四个位置都有server.port,最终生效的是file:./config/application.yml里的那个。


二、同目录下,不同格式的优先级(2.3 vs 2.4+ 有反转)

⚠️ 这里是高频踩坑点,很多人背的还是老答案。

  • Spring Boot ≤ 2.3.xproperties>yml>yaml(properties 最高)
  • Spring Boot ≥ 2.4.0yaml>yml>properties(反过来,properties 最低)

2.4 引入Config Data API后不再以文件后缀定优先级,而是看spring.config.import声明的顺序;如果没显式 import,同目录propertiesyml都解析,后加载的覆盖先加载的——实际表现就是 yml 翻过来压 properties 了。


三、外部化配置源优先级(凌驾于上面所有文件之上)

文件只是配置源之一,真正生产里改端口、改密码走的都是下面这些,由高到低

  1. 命令行参数java -jar app.jar --server.port=8081
  2. Java 系统属性System.getProperties()-D传的)
  3. 操作系统环境变量SERVER_PORT=8081
  4. JNDIjava:comp/env
  5. RandomValuePropertySourcerandom.*
  6. application-{profile}(jar 外)
  7. application-{profile}(jar 内)
  8. application(jar 外)
  9. application(jar 内)
  10. @PropertySource注解(⚠️ 不支持 profile 变体,仅.properties
  11. SpringApplication.setDefaultProperties()

口诀:命令行 > JVM 参数 > 环境变量 > jar 外 profile > jar 外默认 > jar 内 profile > jar 内默认。


四、Profile 文件的叠加规则

激活dev后,加载顺序是先默认、后 profile、同位置下 profile 压默认

classpath:/application.yml (8080) classpath:/config/application.yml (8082, 覆盖) classpath:/application-dev.yml (8081) classpath:/config/application-dev.yml (8083, 覆盖)

最终server.port=8083profile 文件永远压同名位置的默认文件,不管位置内外。

多 profile 同时激活时(--spring.profiles.active=prod,cloud),后声明覆盖先声明,即application-cloud.ymlapplication-prod.yml


五、Spring Cloud 的 bootstrap(特殊角色)

如果用 Spring Cloud(spring-cloud-starter-bootstrap),还有个bootstrap.yml会比所有application.*更早加载,用来连配置中心(nacos/config server),且不会被 application 覆盖

Spring Cloud 2020+ 默认不启用 bootstrap,要走spring.config.import=configserver:那套新路子。


六、2.4 另外两个值得知道的变更

  • spring.profilesspring.config.activate.on-profile:profile 特定文档里不能再用来激活别的 profile 了
  • 不再自动合并:2.3 前application.yml+application-prod.yml隐式合并;2.4+ 如果application.yml里用了多文档---,是按文档顺序从前往后覆盖,不是按 profile 合并,需要spring.config.import显式引入外部文件,否则升级后容易出现"生产配置没加载"的灵异事件

一张总表收口

最高 ── 命令行 --server.port=8081 │ ├─ JVM 参数 -Dserver.port=8081 ├─ 环境变量 SERVER_PORT=8081 │ ├─ bootstrap.yml (Spring Cloud, 仅引导期) │ ├─ file:./config/application-{profile}.yml ├─ file:./config/application.yml ├─ file:./application-{profile}.yml ├─ file:./application.yml │ ├─ classpath:/config/application-{profile}.yml ├─ classpath:/config/application.yml ├─ classpath:/application-{profile}.yml └─ classpath:/application.yml 最低 ── @PropertySource / setDefaultProperties

实战建议:本地resources/application.yml放默认值 + 多环境application-{profile}.yml;生产 jar 外./config/application-prod.yml放运维覆参(数据库、密钥),敏感信息优先走环境变量或 K8s Secret 挂载,别写死在文件里。

http://www.gsyq.cn/news/1621422.html

相关文章:

  • 如何用MetaTube智能插件轻松管理Jellyfin媒体库元数据
  • STM32F411RE与TPS65263的三重降压电源方案设计
  • Modbus主站和从站例程应用协议
  • VinXiangQi深度体验:从零开始掌握智能象棋连线工具
  • Three.js 人物虚化教程
  • 开源通用漏洞扫描器Sirius Scan:从架构解析到CI/CD集成的实战指南
  • 6DoF运动追踪:IIM-42652 IMU与PIC32微控制器实战
  • 基于74HC32与PIC18F97J60的2x2矩阵键盘设计
  • 基于TPAFE0808和MK51DN512的多通道信号采集系统设计
  • QMcDump:终极QQ音乐加密文件解码工具完整指南
  • AI工具如何解决本科毕业论文写作三大痛点
  • 基于Si4732与PIC18F2525的高保真收音机设计
  • 中国车牌生成器:快速生成逼真车牌图像的终极解决方案
  • 基于Si4731与STM32的数字收音机设计与实现
  • RPG Maker游戏解密终极指南:3步轻松提取加密资源
  • MuleSoft+LLM企业级AI编排:打通系统孤岛与语义断层
  • Sqribble文档流水线:模板驱动的结构化PDF生成系统
  • 基于Si4731与PIC18F2585的数字收音机系统设计与实现
  • 炉石传说脚本:5分钟掌握自动化游戏秘籍,解放你的双手!
  • QQ音乐格式转换终极指南:qmcdump轻松解密加密音频
  • 基于STM32与Si4731的数字收音机系统设计与实现
  • 认准中华土蜂!这瓶旋转蜂蜜水,和普通意蜂蜜水根本不是一回事
  • 基于Si4731与PIC18F86J50的可编程FM收音机系统设计
  • 13DOF传感器与PIC18F2525实现低成本高精度定位导航
  • 3步轻松搞定音乐歌词批量下载:免费开源工具解决你的歌词烦恼
  • Ansys Motor-CAD 15.1.2 安装激活全套流程
  • 【每日学术速报】2026-06-29|从人力密集到系统自足:医学AI的数据解放与机器人学习的研究自主化
  • 如何用Fate/Grand Automata实现FGO自动化:新手5分钟上手指南
  • 模板驱动型文档自动化:企业级文档工程化实践
  • 2026汉中黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式