一、结论

Spring Boot 中,位置越靠后优先级越高,外部配置压倒内部配置,命令行参数拥有最高优先权。

案例:

在一次生产事故中,某团队通过 application-prod.properties 将服务端口设为 9000,但某运维人员在启动命令中加入了 --server.port=8080。最终服务运行在了错误端口,接口全部挂掉,业务中断近10分钟。

原因?配置优先级未搞清楚。

这篇文章将带你系统掌握:

  • Spring Boot 配置文件与配置源的优先级规则
  • 多环境配置加载机制与冲突排查技巧
  • 常见场景下如何安全合理管理配置

二、配置优先级结构化剖析

1. 配置文件物理位置优先级

Spring Boot 启动时会自动加载配置文件,并根据物理位置顺序决定优先级。

优先级文件位置示例路径优先级趋势
1classpath:/src/main/resources/application.properties🡻最低
2classpath:/config/src/main/resources/config/
3file:./程序运行目录下的application.properties
4file:./config/程序运行目录下的config/application.properties
5file:./config/*/运行目录下多层子目录中的配置文件🡹最高

举个例子:

假设配置如下:1. classpath:/application.propertiesserver.port=8080app.name=MyApp2. file:./application.propertiesserver.port=90903. file:./config/application.propertiesapp.name=ProdApp最终生效的是:
- server.port=9090(外部覆盖内部)
- app.name=ProdApp(优先级更高的 config 文件覆盖)

2. 配置源类型优先级

Spring Boot 不仅从配置文件读取属性,还可能从环境变量、命令行等多种来源加载配置。这些配置源的优先级也有先后之分

配置源优先级图谱
默认属性setDefaultProperties
PropertySource 注解
配置文件
环境变量
系统属性D
SPRING_APPLICATION_JSON
命令行参数
关键加载顺序(由低到高):
  1. SpringApplication.setDefaultProperties
  2. @PropertySource("...")
  3. 配置文件(.properties / .yml)
  4. 环境变量(如 export SERVER_PORT=9090
  5. JVM系统参数(-Dserver.port=9090
  6. SPRING_APPLICATION_JSON 环境变量(支持JSON格式)
  7. 命令行参数(最高优先级)

实战例子:

java -jar app.jar --server.port=9999

即使 .properties 中配置了 server.port=8080,最终还是 9999 生效。


3. 环境配置覆盖机制(多环境配置)

Spring Boot 支持通过 profile 来管理多环境配置(如 dev/test/prod),这背后的核心是 profile-specific 配置文件加载策略

多环境配置加载逻辑:

加载顺序如下(生效配置会覆盖默认):

  1. application.properties(默认配置)
  2. application-{profile}.properties(特定环境覆盖)
激活方式三选一:
  1. 配置文件中指定:

    spring.profiles.active=prod
    
  2. 启动参数中指定:

    --spring.profiles.active=prod
    
  3. 环境变量指定:

    export SPRING_PROFILES_ACTIVE=prod
    
多Profile叠加场景:
# application.properties
spring.profiles.active=dev,test# application-dev.properties
log.level=DEBUG# application-test.properties
log.level=INFO

最终哪个生效?后激活的profile生效(test > dev),即 INFO


4. 配置验证(排查工具)

当你困惑“到底哪个配置生效了?”可以用以下三种方式排查:

Actuator /env 端点
curl http://localhost:8080/actuator/env

输出内容会告诉你每个属性的来源。

日志输出

Spring Boot 启动时会打印配置文件查找路径:

Config data locations:- file:./config/- file:./- classpath:/config/- classpath:/
代码方式打印配置来源
@Autowired
Environment environment;@PostConstruct
public void printPropertySources() {for (PropertySource<?> ps : ((AbstractEnvironment) environment).getPropertySources()) {System.out.println("Source: " + ps.getName());System.out.println("server.port = " + ps.getProperty("server.port"));}
}

三、典型实战场景解析

场景1:开发 vs 生产配置分离

建议:

  • 开发配置放在 jar 内(如 application-dev.properties
  • 生产配置放在外部 ./config/application-prod.properties
  • 启动时用 --spring.profiles.active=prod 激活

这样可以在不重新打包的前提下,实现灵活环境切换。


场景2:容器化部署配置(Docker/K8s)

推荐顺序:

  1. 命令行参数(覆盖一切)
  2. 环境变量(配合 K8s Secret/ConfigMap 注入)
  3. 文件挂载(将配置挂载至 /config/

样例Dockerfile:

ENV SPRING_PROFILES_ACTIVE=prod
COPY config/ /config/
ENTRYPOINT ["java", "-jar", "app.jar", "--server.port=9090"]

场景3:配置安全分层

做法建议:

  • 敏感配置(如密码)通过 环境变量 注入
  • 不敏感配置 保留在 .properties 文件中
  • 使用 @ConfigurationProperties + @Validated 加强类型约束

四、总结

核心口诀:

“外大于内,命大于环,动大于静”

  • 外部配置 > 内部配置(jar包内)
  • 命令行 > 环境变量 > 文件配置
  • 动态配置源(命令、env)比静态文件优先

避坑建议:

  • 避免把敏感数据写进 @PropertySource 注解中(不安全且优先级低)
  • 不要在多个位置重复配置同一属性,容易误判生效值
  • 注意profile加载顺序,后指定的覆盖前面的

拓展思考:

如果你使用配置中心(如 Nacos、Apollo),你还需考虑:

  • 配置中心刷新机制(如Spring Cloud Config的监听刷新)
  • 本地配置是否允许覆盖远程配置
  • 如何记录配置来源和变更历史(方便审计和回溯)

结语

掌握配置优先级,是一个成熟Spring Boot工程师的基本功。别让一行配置毁掉一条生产链路。借助本文的方法论和工具手段,你可以轻松驾驭复杂环境,让配置服务于系统,而不是系统为配置买单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88067.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88067.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88067.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式数据库sqlite测试程序

继上篇对嵌入式数据库sqlite的移植和注意项&#xff0c;以及使用命令行测试之后&#xff0c;本篇对其进行了更进一步的程序测试&#xff0c;以备近期在项目中使用。测试程序及说明如下&#xff1a;/**************** 相关函数说明 ******************/ /* (1)sqlite3_open的函…

【学习篇】SQL复杂查询学习

要求&#xff1a;能对千万行级别的大表优化读写效率。 难点&#xff1a;如何创建千万行级别的大表 MySQL数据库的高效查询不仅依赖于合理的表结构和索引设计&#xff0c;还需要掌握高级查询技巧和性能优化方法。 数据表与数据表之间关系三种&#xff1a;实体之间关系 多对多…

Sequential Predictive Modeling of Clinical Trial Outcome with Meta-Learning解读

SPOT(Sequential Predictive Modeling of Clinical Trial Outcome with Meta-Learning)模型是用于临床试验结果预测的模型, 借鉴了模型无关元学习(MAML,Model-Agnostic Meta-Learning)的框架,将模型参数分为全局共享参数和任务特定参数,以平衡跨任务泛化与任务内适配:…

优先选择列表而非数组及泛型类型的使用

数组与泛型的核心差异 协变性与不变性 数组采用协变(covariant)类型规则:若Sub是Super的子类型,则数组类型Sub[]也是Super[]的子类型。这种设计允许以下代码通过编译: Object[] objectArray = new Long[1]; // 编译通过 objectArray[0

自动化Prompt生成平台的研发体系设计

一份轻松不啰嗦的自动化Prompt平台研发攻略 &#x1f4d1; 目录 一、项目背景二、平台整体架构设计三、核心功能模块解析四、自动化流程设计五、样式与跨平台规范六、总结与展望 一、项目背景 在大模型应用爆发的今天&#xff0c;不写Prompt的工程师&#xff0c;正在变成“写…

[Swarm] 上下文变量 | 接入function功能调用 | Mcp

第3章&#xff1a;上下文变量 欢迎回到swarm&#xff01; 在前两章中&#xff0c;我们学习了作为对话指挥者的Swarm框架和具备指令与技能的专用AI角色智能体。(智能体就相当于是给用户问题 已经写好了的提示词&#xff0c;在用户提问时自动加入&#xff0c;以此来给用户更好的…

【Unity开发】Unity实现第一人称视角与第三人称视角切换功能

一、效果展示 第三人称视角&#xff1a;固定摄像机&#xff0c;无任何操作 第一人称视角&#xff1a;用户可以通过wsad进行前后左右移动&#xff0c;qe进行上升下降操作 不同视角之间切换会有一个过渡动画&#xff0c;切换第一视角的初始位置始终为原点&#xff08;0,0,0&am…

2025全球数字经济大会—云智算安全论坛暨第三届“SecGo论坛”成功召开!共筑安全新生态

2025年7月3日&#xff0c;由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院、中国通信标准化协会承办的全球数字经济大会—云智算安全论坛暨第三届“SecGo论坛”在京召开。北京市经济和信息化局副局长顾瑾栩、中国通信标准化协会副理事长兼秘书长代晓慧、中国信通院…

KingbaseES聚焦产品上线:金仓数据库在线体验平台上线,开启数据库实践新征程

KingbaseES聚焦产品上线&#xff1a;金仓数据库在线体验平台上线&#xff0c;开启数据库实践新征程KingbaseES 在线体验平台是为数据库使用者、开发者、架构师及 DBA 打造的轻量化实践平台&#xff0c;无需本地安装数据库环境&#xff0c;通过浏览器即可快速上手&#xff0c;降…

LLMs之DeepSeek:AI模型市场深度分析:DeepSeek的挑战与机遇,模型市场份额、Token经济学与未来发展

LLMs之DeepSeek&#xff1a;AI模型市场深度分析&#xff1a;DeepSeek的挑战与机遇&#xff0c;模型市场份额、Token经济学与未来发展 导读&#xff1a;该文章主要分析了中国大语言模型DeepSeek R1发布150天后的市场表现、Token经济学的影响以及AI模型市场的竞争格局。文章指出&…

服装零售企业跨区域运营难题破解方案

在服装零售行业&#xff0c;本地化业务系统因承载库存、销售等核心数据&#xff0c;成为众多企业的选择。然而对于门店分布广、规模较大的服装销售商而言&#xff0c;总部系统与各地门店的远程连接却面临挑战&#xff1a;员工远程办公效率低、POS机数据同步滞后、跨区域监管难度…

- 思考小记

对于 分布式系统&#xff0c;我还是抱有敬畏之心的&#xff0c;因为其内容过于庞大&#xff1b;我在学习基础编程的时候走过一个最大的弯路就是过度追求技术而忽视了基础编码能力&#xff0c;当时在学习springboot的时候&#xff0c;觉得那些新内容都是那么新奇高大上&#xff…

装备制造数字孪生底座平台

在《中国制造2025》和《“十四五”智能制造发展规划》的推动下&#xff0c;数字孪生技术被7次重点提及&#xff0c;成为装备制造业智能化升级的核心战略。从航空航天到重型机械&#xff0c;从设计验证到运维优化&#xff0c;数字孪生底座平台正通过“虚实映射”与“实时交互”&…

Redis构建缓存服务器

环境信息&#xff1a; redis-master----192.168.12.135 redis-slave-1-----192.168.12.136 redis-slave-2-----192.168.12.137 单机版Redis 安装Redis yum install -y gcc make jemalloc jemalloc-devel gcc-c wget tcl yum groupinstall -y "Development Tools" wge…

vscode python debugger关闭编辑器内的变量值自动显示

vscode 的python debugger调试器的最新版本2025.8.0, 会默认把变量的值显示出来, 如下图所示关闭的方法: 打开vscode的settings.json, 左下角点击齿轮按钮, 选择setting(设置), 然后在右上角三个按钮最中间的那个(open setting json), 输入 "debug.inlineValues": &q…

App爬虫工具篇-appium配置

接着上篇文章App爬虫工具篇-Appium安装,安装好了之后,还是不够的,要让其能够驱动手机端,还需要配置。这节课就深入说说如何配置Appium。 安卓手机 如果我们要使用 Android 设备做 App 抓取的话,还需要下载和配置 Android SDK,这里推荐直接安装 Android Studio,其下载地…

SpringAI系列 - 基于Spring AI 1.0.0 的AI助手实现示例

目录 一、基于 Spring AI 1.0.0 的AI助手实现示例二、AI助手架构设计2.1 系统范围与上下文 C12.2 容器图 C22.3 AI助手组件图 C3三、注意事项四、快速启动五、如何启用MCP一、基于 Spring AI 1.0.0 的AI助手实现示例 结合前文系列的介绍,本专栏提供了一个基于Spring AI 1.0.0…

电池预测 | 第33讲 Matlab基于CNN-LSTM-Attention的锂电池剩余寿命预测,附锂电池最新文章汇集

电池预测 | 第33讲 Matlab基于CNN-LSTM-Attention的锂电池剩余寿命预测&#xff0c;附锂电池最新文章汇集 目录电池预测 | 第33讲 Matlab基于CNN-LSTM-Attention的锂电池剩余寿命预测&#xff0c;附锂电池最新文章汇集预测效果基本描述程序设计参考资料源码地址&#xff1a; 电…

软考(软件设计师)数据库原理-SQL

一、SQL基本数据类型 SQL 数据类型速查表类别数据类型说明范围/示例适用场景整数类型INT / INTEGER标准整数类型-2 到 2-1 (-2,147,483,648 到 2,147,483,647)ID、年龄、数量等SMALLINT小范围整数-32,768 到 32,767小范围数值BIGINT大范围整数-2⁶ 到 2⁶-1大额订单号、时间戳T…

docker 安装数据集成平台 Apache SeaTunnel 服务

获取官方镜像 从 Docker Hub 上拉取最新的 Apache SeaTunnel 镜像&#xff1a; docker pull apache/seatunnel:latest创建目录 sudo mkdir -p /data/{conf,logs} # 需要 root 权限创建 /data 目录 sudo chown -R $USER:$USER /data # 将目录权限给当前用户&#xff08;可选&a…