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

📅 2026/7/2 14:26:28
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.xpropertiesymlyamlproperties 最高Spring Boot ≥ 2.4.0yamlymlproperties反过来properties 最低2.4 引入Config Data API后不再以文件后缀定优先级而是看spring.config.import声明的顺序如果没显式 import同目录properties和yml都解析后加载的覆盖先加载的——实际表现就是 yml 翻过来压 properties 了。三、外部化配置源优先级凌驾于上面所有文件之上文件只是配置源之一真正生产里改端口、改密码走的都是下面这些由高到低命令行参数java -jar app.jar --server.port8081Java 系统属性System.getProperties()-D传的操作系统环境变量SERVER_PORT8081JNDIjava:comp/envRandomValuePropertySourcerandom.*application-{profile}jar 外application-{profile}jar 内applicationjar 外applicationjar 内PropertySource注解⚠️ 不支持 profile 变体仅.propertiesSpringApplication.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.port8083。profile 文件永远压同名位置的默认文件不管位置内外。多 profile 同时激活时--spring.profiles.activeprod,cloud后声明覆盖先声明即application-cloud.yml压application-prod.yml。五、Spring Cloud 的 bootstrap特殊角色如果用 Spring Cloudspring-cloud-starter-bootstrap还有个bootstrap.yml会比所有application.*更早加载用来连配置中心nacos/config server且不会被 application 覆盖。Spring Cloud 2020 默认不启用 bootstrap要走spring.config.importconfigserver:那套新路子。六、2.4 另外两个值得知道的变更spring.profiles→spring.config.activate.on-profileprofile 特定文档里不能再用来激活别的 profile 了不再自动合并2.3 前application.ymlapplication-prod.yml隐式合并2.4 如果application.yml里用了多文档---是按文档顺序从前往后覆盖不是按 profile 合并需要spring.config.import显式引入外部文件否则升级后容易出现生产配置没加载的灵异事件一张总表收口最高 ── 命令行 --server.port8081 │ ├─ JVM 参数 -Dserver.port8081 ├─ 环境变量 SERVER_PORT8081 │ ├─ 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 挂载别写死在文件里。