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

SpringBoot 底层原理完整教程(上篇・配置文件与配置优先级)

本篇为整套 SpringBoot 原理系列第一部分,聚焦多格式配置文件、多环境配置加载优先级、项目打包运行、VM 系统参数、命令行参数全套知识点,配套完整配置示例、IDEA 实操截图说明、jar 包运行命令,适合基础巩固、面试背诵;中篇讲解 Spring IOC Bean 管理(作用域、线程安全、第三方 Bean@Bean 注解);下篇深度拆解 SpringBoot 核心两大特性:起步依赖、自动配置、@EnableAutoConfiguration 源码、自定义 Starter 落地实战。

一、SpringBoot 三种配置文件格式

SpringBoot 支持三类配置文件,存放路径统一为resources资源目录,作用完全一致,仅语法格式有区别。

1. properties(键值对格式,早期主流)

语法:key=value,层级靠点分割,无缩进

# 服务端口 server.port=8081 # 数据库配置 spring.datasource.username=root spring.datasource.password=123456

2. yml /yaml(层级缩进格式,企业现在统一推荐)

yaml 是 yml 完整全称,两者语法完全相同,项目统一选其一即可,冒号后必须加空格,靠空格区分层级,可读性更强。

server: port: 8082 spring: datasource: username: root password: 123456

开发规范硬性要求

一个项目中只允许使用一种配置格式,混合使用极易出现配置覆盖、值错乱问题,行业标准统一选用application.yml

二、五种配置加载方式 + 完整优先级排序

SpringBoot 一共支持 5 种配置来源,优先级从低到高(数值越大优先级越高,高优先级会覆盖低优先级相同配置):

  1. application.yaml(最低,最容易被覆盖)
  2. application.yml
  3. application.properties
  4. Java 系统属性(VM Options,-D 开头)
  5. 命令行参数(Program Arguments,-- 开头,优先级最高)

1. 配置文件演示

同项目同时写三类文件设置不同端口:

  • application.yaml → port:8083
  • application.yml → port:8082
  • application.properties → port:8081项目无额外参数启动,最终端口为 8081,properties 覆盖 yaml/yaml。

2. Java 系统属性(VM 参数 -Dxxx=xxx)

IDEA 运行配置操作路径:Run/Debug Configurations → VM options书写格式:-D配置名=值示例:-Dserver.port=9000作用:JVM 启动时传入系统全局变量,优先级高于所有配置文件。

3. 命令行参数(最高优先级 --xxx=xxx)

两种使用场景:

场景 1 IDE 内配置

Program Arguments 输入框填写:--server.port=10010

场景 2 打包 jar 后运行(生产服务器最常用)

maven 执行 package 打包项目,得到 jar 包,cmd / 服务器终端执行:

java -Dserver.port=9000 -jar tlias-web-management-0.0.1-SNAPSHOT.jar --server.port=10010

解析:

  • -Dserver.port=9000:JVM 系统参数
  • --server.port=10010:命令行参数,优先级更高,最终启动端口 10010

优先级核心结论

命令行参数 > JVM 系统属性 > properties > yml > yaml优先级越高,越晚加载,相同 key 直接覆盖前面所有配置值;生产环境常用:打包运行时通过--端口/数据库地址动态切换环境,无需修改配置文件重新打包。

三、SpringBoot 项目打包完整流程

1. 打包必备插件

SpringBoot 项目 pom.xml 必须内置spring-boot-maven-plugin打包插件,新建项目 Spring Initializr 会自动生成,缺失需手动添加:

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>

作用:打包时把内嵌 Tomcat、项目代码、所有依赖 jar 一并打入最终可执行包,普通 jar 无法直接运行。

2. 打包操作

IDEA 右侧 Maven 面板 → Lifecycle → 双击package,编译打包完成后,target 目录生成可执行 jar 包。

3. jar 包运行命令

基础运行:

java -jar 项目名.jar

携带自定义端口参数(覆盖配置文件):

java -jar tlias.jar --server.port=8088

携带 JVM 参数 + 数据库配置:

java -Dspring.profiles.active=prod -jar tlias.jar --spring.datasource.password=666666

四、多配置文件覆盖实操验证案例

测试需求

分别在 yaml/yml/properties 设置不同端口,再添加 VM 参数、命令行参数,观察最终生效端口:

  1. application.yaml:server.port=8083
  2. application.yml:server.port=8082
  3. application.properties:server.port=8081
  4. VM Options:-Dserver.port=9000
  5. Program Arguments:--server.port=10010启动项目,控制台打印端口 10010,完全印证优先级规则。

生产场景价值

  1. 开发环境固定配置写 yml;
  2. 测试 / 生产服务器启动时通过命令行动态修改数据库、端口、日志参数;
  3. 无需修改源码、无需重新打包,运维部署更灵活。

五、yml 语法补充拓展(上篇配套实操)

1. 层级缩进规则

  • 只能使用空格缩进,禁止 Tab 键,IDEA 会自动转换 Tab 为空格;
  • 同层级配置左侧空格对齐;
  • key:冒号后面必须跟一个空格再写值,无空格语法报错。

2. 特殊值处理

数字字符串(手机号、0 开头编码)需要用单 / 双引号包裹,否则 yml 会自动识别为数字:

phone: "013800138000"

3. 集合 / 数组写法

hobby: - java - basketball - travel

六、上篇全文总结

  1. SpringBoot 三种配置:yaml、yml、properties,推荐统一使用 yml,禁止项目混合多格式;
  2. 五种配置来源优先级(由低至高):yaml <yml < properties < JVM 系统属性 (-D) < 命令行参数 (--);
  3. -D 为 JVM 系统参数,-- 为命令行参数,命令行优先级最高,可动态覆盖任意配置;
  4. 项目打包依赖 spring-boot-maven-plugin 插件,打包后 java -jar 运行;
  5. 生产部署可在 jar 运行命令中传入数据库、端口参数,无需修改配置文件。

上篇拓展实操练习

  1. 新建 SpringBoot 项目,同时创建三种配置文件,设置不同端口,观察启动端口;
  2. IDE 添加 VM 参数、命令行参数,验证高优先级覆盖效果;
  3. 使用 Maven package 打包项目,cmd 执行 jar 并通过 -- 修改启动端口。

上篇面试高频考点

  1. SpringBoot 支持哪些配置文件,三种格式区别?
  2. 配置加载优先级从低到完整排序;3 -D 和 -- 参数分别代表什么,优先级谁更高?
  3. SpringBoot 打包必须插件是什么,作用?
  4. 生产环境为什么推荐使用命令行传递配置?
http://www.jsqmd.com/news/1098829/

相关文章:

  • Anthropic揭秘Claude隔离内幕、加州政府半价用上AI、主权AI来了:今天6件大事
  • 35款自动脱壳工具合集:逆向工程中的“开罐器”与“手术刀”
  • 01 静态分析(Static Analysis)
  • *如何使用* *bc* 进行高级*数学*计算?
  • 只会写业务 UI 走不远!吃透这套 Framework 体系,跳槽大厂拉开薪资差距
  • 打卡信奥刷题(3414)用C++实现信奥题 P10139 [USACO24JAN] Nap Sort G
  • StarRocks StreamLoad 持续写入导致 be 内存增长
  • Kimi LeetCode 3410. 删除所有值为某个元素后的最大子数组和 Python3实现
  • 2026年桌面风扇类型选购要点:从四个核心部件看懂一台风
  • 羽毛球工具 App HarmonyOS 6.0 实战(02/10):ArkUI 响应式布局
  • Apache Commons Text RCE漏洞CVE-2022-42889:原理、复现与安全修复
  • 什么!翻译论文还要消耗token? 关于如何提升marker转英文文档速度,并使用skill批量翻译论文
  • 官方 API 与中转 API 选型实测指南
  • openEuler-portal-mcp智能推荐系统:如何实现100%工具推荐覆盖率
  • 广告创意提案怎么做?用多模型联动快速制作动态 Demo 提案实战与对比
  • VMware导入虚拟机失败?90%的运维人都踩过的7个隐藏陷阱及修复命令清单
  • 5大特色揭秘:ZR.Admin.NET企业级权限管理平台实战指南
  • 把 ES Repository 纳入 CMS 轨道,一套更稳的 SAP PI 内容传输治理方式
  • 羽毛球工具 App HarmonyOS 6.0 实战(03/10):本地优先数据方案
  • 从真实高可用链路看 SAP AEX local SLD 配置,别让 SLD 成为集群切换时的隐形单点
  • Kali Linux 渗透测试环境搭建:VMware 虚拟机安装配置全流程指南
  • Crypto方向 · RSA已知部分明文攻击(Coppersmith方法)
  • 浅谈C++重载、重写、重定义
  • YOLOv8知识蒸馏实战:从37%到42%mAP,无损提升轻量模型精度
  • Bebas Neue:开源字体设计的几何美学革命
  • 这门课程适合谁?
  • 紧急预警:VMware克隆未启用“Reconfigure after clone”将触发许可证异常——2024 Q3 VMware官方补丁前最后规避指南
  • C语言指针详解3
  • TVA:连接数字与物理世界的智能底座(5)
  • 工作原理:其核心是一个两步过程。