Spring Boot 配置文件的优先级是什么?环境变量、命令行和 application.yml 谁覆盖谁?
下面是一段教学模拟,不是真实面试记录。
🧑💻 面试官:application.yml 写端口 8080,环境变量设成 9090,启动参数又写 7070,最后用哪个?
🙋♂️ 我:命令行优先,应该是 7070。
🧑💻 面试官:那命令行在任何环境里都是最高优先级吗?测试注入的配置呢?
🙋♂️ 我:还要看全部来源。
🧑💻 面试官:生产配置没生效,你会先查值,还是先查文件名和加载来源?
配置问题要沿着「来源、加载、覆盖、绑定」检查。文件里写了一个值,不代表它最终被应用使用。
面试速答(60 秒版)
Spring Boot 会从多个 PropertySource 读取配置,并按规定顺序覆盖。在正常启用命令行属性的情况下,只比较命令行、环境变量和 application 配置文件,通常是命令行优先于环境变量,环境变量优先于配置文件。
但这不是完整优先级表,测试配置、系统属性和自定义来源等也需要考虑。
配置文件内部还要确认位置与 Profile:包外、包内、默认文件和特定 Profile 文件之间有加载规则。
排查时,我会先确认配置有没有加载,再确认激活的 Profile 和更高优先级来源,最后检查字段绑定与实际使用位置。不能只反复修改同一份 yml,却不看最终值来自哪里。

图里只比较这三种来源,并且假设命令行属性正常启用、没有其他来源继续覆盖。因此最终值是 7070,但它不是一张完整的配置优先级表。
知识点详解:同一个配置键,怎样得到最终值?
先比较来源,再比较文件
假设教学配置使用 server.port:
| 来源 | 假设值 |
|---|---|
| application.yml | 8080 |
| OS 环境变量 SERVER_PORT | 9090 |
| 启动参数 —server.port=7070 | 7070 |
在默认接受命令行属性、且没有其他更高来源覆盖的情况下,最终使用 7070。
重点是前提。Spring Boot 可以关闭命令行属性加入,测试环境也可以加入优先级更高的来源。因此“命令行永远最高”不准确。官方来源顺序
生产问题还需要检查容器实际注入的环境,而不是只看开发机器的变量。
application-prod.yml 不是放进去就自动生效
特定 Profile 文件是否参与读取,首先取决于相应 Profile 是否激活。
同样的配置键可能出现在包内默认文件、包内 Profile 文件、包外文件以及包外 Profile 文件。标准加载规则允许后面的来源覆盖前面的值,但自定义位置、导入和分组会进一步影响过程。
所以要同时核对:激活了哪些 Profile,文件是否位于实际搜索位置,是否使用了替换默认位置的配置。
不要把“目录里有 prod 文件”当成运行环境正在使用它的证明。配置文件是候选来源,实际加载才是事实。
环境变量还需要映射到正确的配置键
环境变量往往不能直接使用点号,框架通过相应绑定规则处理名称。
server.port 与 SERVER_PORT 是常见例子,但复杂键名、列表或自定义结构不宜只凭经验猜测。应按官方 relaxed binding 规则与实际绑定对象检查。
值读进 Environment,也不保证所有代码都用了它。某个地方如果写死常量、手动读取另一键名,或者绑定对象没有被正确创建,仍会出现“配置看起来正确,行为却没变”。
因此排查的最后一段是:最终值怎样进入业务代码?
查询配置来源时,不要泄露秘密
可以使用受控诊断信息,检查最终值与来源。Actuator 的 env、configprops 等工具能够辅助定位,但必须限制访问并处理敏感内容。
公开打印完整环境变量,可能把数据库密码、API Key 和签名材料一起暴露。诊断一个超时值,不需要输出整套生产环境。
较好的记录包括配置键、脱敏后的有效值、来源位置、激活 Profile 和应用版本。这样才能说明为什么某一次启动用了这个值,而不是只留一张配置文件截图。
面试官继续追问
系统属性和环境变量相同,谁更优先?
在官方标准顺序中,Java System properties 位于 OS 环境变量之后,可覆盖其值。完整环境仍应核对其他来源和自定义设置。
改完外部配置,进程会自动更新吗?
不能默认。普通外部配置加载与运行时刷新是不同能力,需要看具体组件和设计。文件变化不代表已经运行的对象重新绑定。
配置优先级和 Bean 覆盖是同一回事吗?
不是。一个决定属性值来源,另一个涉及同名 Bean 的定义与注册规则,不应混成一张覆盖表。
面试速记卡
- 常见比较:启用默认规则时,命令行通常高于环境变量,高于配置文件。
- 完整范围:测试、系统属性与自定义来源还会参与覆盖。
- 文件规则:位置、Profile、导入与实际加载路径都要检查。
- 排查链路:来源 → 加载 → 覆盖 → 绑定 → 使用。
- 诊断安全:核对有效值与来源,敏感配置必须脱敏。
公司面试真题
这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。
浏览公司面试真题 →