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

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. 生产环境为什么推荐使用命令行传递配置?