spring.config.location会完全替换默认配置路径,而spring.config.additional-location仅追加到默认路径链末尾(最低优先级);正确做法是用spring.config.location显式按优先级列出所有路径。

Spring Boot 中 spring.config.location 和 spring.config.additional-location 的区别
想让外部配置文件(比如 ./config/application-prod.yml)生效且优先于 classpath 内的默认配置,不能只靠放对位置——得用对启动参数。关键在两个属性:spring.config.location 会**完全替换**默认加载路径,而 spring.config.additional-location 是**追加**到默认路径链末尾(即最低优先级),极易误用。
-
spring.config.location=classpath:/override/:清空所有默认路径(file:./config/、classpath:/config/等全失效),只加载你指定的目录 → 风险高,除非你明确要接管全部配置源 -
spring.config.additional-location=file:./external/:该目录会被加到默认链的最后,也就是比classpath:/还低 → 即使你写了server.port=9000,也大概率被 jar 包内的application.yml覆盖 - 真正安全可控的做法是:用
spring.config.location显式列出你想要的全部路径,并按优先级从高到低排列,例如:java -jar app.jar --spring.config.location=file:./config/,file:./,classpath:/config/,classpath:/
为什么 application-{profile}.yml 不一定比 application.yml 优先?
Profile 专用文件的优先级不是绝对的,它依赖于「加载时机」和「是否被激活」。即使存在 application-prod.yml,如果 spring.profiles.active 没被设为 prod,它根本不会被加载;而一旦激活,它的同名属性才会覆盖 application.yml 中的对应项。
- 激活方式有优先级:命令行参数
--spring.profiles.active=prod> 环境变量SPRING_PROFILES_ACTIVE=prod> 配置文件中写的spring.profiles.active=prod - 注意:Profile 文件只对「同名 key」生效,不会合并结构;比如
application.yml定义了logging.level.root=INFO,application-prod.yml只写了server.port=8081,那日志级别仍为 INFO - 若同时激活多个 profile(如
--spring.profiles.active=prod,mysql),则application-prod.yml和application-mysql.yml都会加载,且按 profile 声明顺序决定覆盖关系(先 prod 后 mysql,所以 mysql 中同名 key 会覆盖 prod)
PRELOAD 不是 Spring Boot 原生概念,别被误导
搜索“Spring Boot PRELOAD”或“REL=preload”容易掉进前端或浏览器资源预加载的坑里——这和 Spring Boot 外部配置加载机制完全无关。rel="preload" 是 HTML <link> 标签的属性,用于提示浏览器提前获取 JS/CSS 字体等资源;而 Spring Boot 的配置加载不涉及任何 HTML 或客户端预加载逻辑。
- Spring Boot 没有
PRELOAD配置项,也没有REL属性控制配置加载顺序 - 如果你在某文档里看到类似写法,大概率是混淆了 Web 资源加载(前端)和应用配置加载(后端 JVM 层)两个完全不同的层面
- 真正影响“预加载行为”的只有
spring.config.location、profile 激活状态、以及命令行参数这些启动期就确定的输入
最容易忽略的陷阱:jar 包外配置文件被 IDE 自动忽略
本地开发时用 IDEA 运行 Spring Boot 项目,file:./config/ 这类路径默认指向的是项目根目录,而不是最终打包后的 jar 同级目录——但 IDE 并不会自动把 ./config/ 下的文件复制到运行时工作目录,导致你以为配了却没生效。
- 验证方法:启动时加
--debug,观察日志中ConfigDataLocationResolver打印的实际加载路径 - IDEA 中需手动设置 Working directory 为项目根目录(Run → Edit Configurations → Configuration → Working directory)
- 更稳妥的做法是:本地开发统一用
--spring.config.location=file:./config/显式指定,并确保该目录真实存在且有读取权限 - CI/CD 构建后,务必确认部署脚本把外部配置文件放到了 jar 包同级或
./config/目录下,而不是仅放在源码里










