SpringBoot 配置全攻略:从文件类型到数据读取
开篇:为什么配置是 SpringBoot 的 “开关”?
你有没有想过:SpringBoot 的内置 Tomcat 默认端口是 8080,怎么改成 80?连接 MySQL 时,数据库地址、账号密码写在哪?这些 “自定义设置” 全靠配置文件实现。
SpringBoot 的配置就像 “家电遥控器”—— 不用拆开机箱(改源码),按几个键(改配置)就能调整功能。
一、基础:3 种配置文件类型,选 yml 就对了
配置的重要性与类型
在SpringBoot项目中,配置是连接代码和运行环境的桥梁。主要配置分为两类:
- 三方技术配置:如Redis、MyBatis、数据库连接等
- 自定义配置:应用特定的参数和设置
配置文件格式与优先级
SpringBoot支持三种配置文件格式,按优先级从高到低排列:
1. 3 种配置文件对比(附写法示例)
| 类型 | 文件名 | 语法风格 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|---|---|
| Properties | application.properties |
键值对(key=value) | 写法简单,兼容性强 | 层级多时空格多,可读性差 | ★★☆ |
| YAML | application.yml |
缩进层级(key: value) | 层级清晰,可读性强(主流) | 对缩进敏感,易写错 | ★★★ |
| YAML | application.yaml |
同.yml | 同.yml | 文件名较长,不如.yml 常用 | ★★☆ |
写法示例:改 Tomcat 端口为 80
-
Properties 写法:
# application.properties server.port=80 -
YML 写法(注意冒号后有空格):
# application.yml server: port: 80 # 冒号后必须加空格,缩进用空格(不能用Tab)
2. 核心规则:优先级与覆盖逻辑
多个配置文件同时存在时,SpringBoot 会按 “优先级高的覆盖低的,不同配置全保留” 的规则生效:
优先级顺序(从低到高)
application.yaml < application.yml < application.properties < Java系统属性(-Dxxx=xxx) < 命令行参数(--xxx=xxx)
通俗举例:
- 「application.yml」设
server.port=81,「application.properties」设server.port=80→ 最终端口是 80(properties 优先级高); - 「application.yml」设
server.port=81,「application.properties」设spring.datasource.url=xxx→ 两个配置都生效(端口 81,数据库地址 xxx); - 命令行启动时加
java -jar app.jar --server.port=88→ 端口最终是 88(命令行优先级最高)。
二、重点:YML 配置文件(小白必学,主流用法)
YML(.yml)是现在最常用的配置格式,核心优势是 “层级清晰、数据直观”。但它对语法要求严格,小白常踩坑,下面逐个讲透。
1. YML 核心语法规则(记 3 条,少踩坑)
- 缩进用空格,不能用 Tab:同层级必须左对齐(比如server下的port,缩进 2 个或 4 个空格都可,但要统一);
- 冒号后必须加空格:
key: value(冒号和 value 之间有空格,否则报错); - 大小写敏感:
server.port和Server.Port是两个不同的配置; - # 表示注释:注释内容从 #开始到行尾,不影响配置生效。
2. 数据类型写法(附示例,直接抄)
YML 支持字面值、数组、对象等常见数据类型,每种类型的写法都有讲究:
(1)字面值(单个值:字符串、数字、布尔等)
| 数据类型 | 写法示例 | 注意事项 |
|---|---|---|
| 字符串 | name: 张三 或 "张三\t李四" |
含特殊字符(如 \t 换行)需用双引号包裹 |
| 整数 | age: 18 或 num: 0b1010(二进制) |
以 0 开头的数字可能被当进制(如 0127→八进制 87),需加引号**“0127”** |
| 浮点数 | price: 3.14 或 pi: 3.14e5 |
支持科学计数法 |
| 布尔值 | enable: true 或 flag: FALSE true/false |
不区分大小写 |
| 空值 | desc: ~ |
用~表示 null |
| 日期 | birthday: 2024-05-20 |
日期必须是yyyy-MM-dd格式 |
| 时间 | createTime: 2024-05-20T14:30:00+08:00 |
时间和日期用 T 连接,+ 代表时区(东八区) |
(2)数组(多个同类型数据)
两种写法:“多行展开”(清晰)和 “单行缩略”(简洁),按需选。
# 1. 多行展开(推荐,可读性强)
subject:
- Java # 减号+空格+数据,每行一个元素
- 前端
- 大数据
# 2. 单行缩略(适合短数组)
subject: [Java, 前端, 大数据]
(3)对象(多个键值对,如用户、数据库信息)
同样支持多行和单行,实际开发中多行更常用(比如配置数据库):
# 1. 多行展开(配置MySQL示例)
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver # 数据库驱动
url: jdbc:mysql://localhost:3306/ssm_db # 连接地址
username: root # 账号
password: 123456 # 密码
# 2. 单行缩略(简洁版)
datasource: {driver-class-name: com.mysql.cj.jdbc.Driver, url: jdbc:mysql://localhost:3306/ssm_db}
(4)对象数组(多个对象组成的数组,如用户列表)
# 多行展开(推荐)
users:
- name: 张三
age: 20
- name: 李四
age: 22
# 单行缩略
users: [{name: 张三, age: 20}, {name: 李四, age: 22}]
三、进阶:YML 配置数据怎么读?3 种方法任选
写好配置后,怎么在 Java 代码里获取这些值? 比如读server.port或datasource.url,3 种方法覆盖所有场景。
| 读取方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
@Value |
读取单个简单配置 | 简单直接 | 配置分散,难以管理 |
Environment |
动态读取配置 | 灵活 | 类型转换需要手动处理 |
@ConfigurationProperties |
读取一组相关配置 | 类型安全,集中管理 | 需要创建配置类 |
方法 1:@Value 注解(读单个数据,最简单)
适合读取 “零散的单个配置项”(比如端口、课程名),直接在变量上用@Value("${配置项}")注入。
示例:读端口和课程名
YML 配置:
# application.yml
lesson: SpringBoot # 自定义配置:课程名
server:
port: 80 # 系统配置:端口
Java 代码:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigController {
// 读单个配置:${一级键.二级键...}
@Value("${lesson}")
private String lessonName; // 注入lesson的值:SpringBoot
@Value("${server.port}")
private int port; // 注入server.port的值:80
// 测试接口:访问http://localhost/info
@GetMapping("/info")
public String getInfo() {
return "课程:" + lessonName + ",端口:" + port;
}
}
- 优点:简单直接,一行代码搞定;
- 缺点:需要一个个注入,多个配置项时繁琐。
方法 2:Environment 对象(读多个数据,灵活)
适合读取 “多个配置项”,通过@Autowired注入Environment对象,再用getProperty("配置项")获取值。
示例:读数据库配置
YML 配置:
# application.yml
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db
username: root
password: 123456
Java 代码:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DbController {
// 注入Environment对象(Spring内置,管理所有配置)
@Autowired
private Environment env;
@GetMapping("/db")
public String getDbInfo() {
// 用getProperty读取配置,参数是"一级键.二级键"
String driver = env.getProperty("datasource.driver-class-name");
String url = env.getProperty("datasource.url");
String user = env.getProperty("datasource.username");
return "驱动:" + driver + ",地址:" + url + ",用户:" + user;
}
}
- 优点:不用写多个 @Value,按需读取;
- 缺点:每次获取都要写字符串键,容易拼错。
方法 3:自定义对象(读批量数据,实际最常用)
适合读取 “一组相关的配置项”(比如数据库、企业信息),把配置封装成 Java 对象,通过@ConfigurationProperties自动注入。核心步骤:定义 Bean + 加注解绑定配置前缀。
示例:封装数据库配置为对象
YML 配置(同上,数据库配置):
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db
username: root
password: 123456
定义封装类(必须是 Spring Bean):
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
// 1. @Component:把类交给Spring管理(必须加,否则无法注入)
@Component
// 2. @ConfigurationProperties(prefix = "datasource"):绑定配置的前缀
// 表示读取"datasource"下的所有子配置项
@ConfigurationProperties(prefix = "datasource")
public class DataSourceConfig {
// 3. 属性名要和配置项匹配(支持驼峰命名)
// driver-class-name → driverClassName(横杠转驼峰)
private String driverClassName;
private String url;
private String username;
private String password;
// 必须加getter/setter(Spring通过setter注入值)
public String getDriverClassName() { return driverClassName; }
public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; }
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
在 Controller 中使用:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ObjectController {
// 直接注入自定义的配置对象
@Autowired
private DataSourceConfig dataSourceConfig;
@GetMapping("/db-object")
public String getDbObject() {
return "驱动:" + dataSourceConfig.getDriverClassName()
+ ",密码:" + dataSourceConfig.getPassword();
}
}
优点:
- 配置项与对象属性自动匹配,不用手动写${};
- 支持 IDE 提示(输入属性名时会提示配置项);
- 适合批量读取相关配置(如数据库、Redis)。
缺点:需要定义专门的封装类,略占代码量。
通过合理使用SpringBoot的配置系统,你可以创建出更加灵活、可维护的应用程序。记住选择适合你项目规模的配置方式,小型项目可以用@Value,中大型项目推荐使用@ConfigurationProperties。
四、实用技巧:配置项的 “变量引用”
YML 支持用${配置项}引用已定义的值,避免重复书写,比如拼接路径:
示例 1:路径拼接(复用基础路径)
# 基础路径
baseDir: /usr/local/app
# 引用baseDir,拼接子路径
center:
dataDir: ${baseDir}/data # 结果:/usr/local/app/data
logDir: ${baseDir}/log # 结果:/usr/local/app/log
tmpDir: ${baseDir}/tmp # 结果:/usr/local/app/tmp
示例 2:特殊字符转义(用双引号)
如果配置项含转义字符(如\t制表符、\n换行符),需要用双引号包裹,否则转义字符会失效:
# 不加双引号:\t被当普通字符,结果是"Spring\tBoot"
lesson1: Spring\tBoot
# 加双引号:\t被解析为制表符,结果是"Spring Boot"
lesson2: "Spring\tBoot"
五、小白必看:2 个高频问题解决
1. YML 写配置没有代码提示?
- 原因:IDEA 没识别到配置文件,没加载 SpringBoot 的配置元数据。
- 解决步骤:
- 打开 IDEA→File→Project Structure→Facets;
- 选中你的项目→Customize Spring Boot→Select Configuration Files;
- 勾选application.yml→OK,重启 IDEA 即可有提示。
2. @ConfigurationProperties 注入失败?
排查 4 点:
- 类上有没有加
@Component(必须是 Spring Bean); - prefix的值是否和配置项的前缀一致(比如配置是
datasource,prefix 不能写dataSource); - 类的属性名是否和配置项匹配(横杠转驼峰,比如
driver-class-name→driverClassName); - 有没有加
getter/setter(Spring 通过 setter 注入值,缺一不可)。
六、总结:核心要点速查表
| 内容 | 核心结论 | 记法 |
|---|---|---|
| 配置文件类型 | yml 为主流,properties 优先级最高 | 写 yml,冲突看 properties |
| YML 语法核心 | 缩进用空格,冒号后加空格,大小写敏感 | 空格缩进,冒号空格不能少 |
| 数据读取方法 | 单个用 @Value,批量用自定义对象 | 少用 @Value,多用对象封装 |
| 变量引用 | ${} 复用配置,特殊字符用双引号 | 路径拼接用 ${},转义加引号 |
SpringBoot 配置的核心是 “简洁直观”—— 不用写复杂的 XML,按规则填配置项,再用合适的方法读取即可。跟着示例写一遍,你会发现配置其实比想象中简单!
更多推荐


所有评论(0)