SpringBoot 配置文件
- properties
- yml
-
- [yml 基础语法](#yml 基础语法)
- [读取 yml 信息](#读取 yml 信息)
-
- [方式一:使用 @Value 注解](#方式一:使用 @Value 注解)
- [方式二:使用 @ConfigurationProperties 注解](#方式二:使用 @ConfigurationProperties 注解)
- [properties 和 yml 对比](#properties 和 yml 对比)
- [yml 优缺点](#yml 优缺点)
properties
properties 基础语法
properties 文件是 SpringBoot 中一种常用的配置文件格式,其核心语法为 key=value。
properties
# 基本格式
key=value
# 使用 . 进行层级分隔
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
# 自定义配置
my.key=hello
my.name=SpringBoot
数据库配置示例
properties
# 数据库连接配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
# 连接池配置
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.idle-timeout=30000
读取 properties 信息
方式一:使用 @Value 注解
java
@Component
@Date
public class MyConfig {
@Value("${my.key}")
private String myKey;
@Value("${my.name}")
private String myName;
}
方式二:使用 @ConfigurationProperties 注解
java
@Component
@ConfigurationProperties(prefix = "my")
public class MyProperties {
private String key;
private String name;
// getter 和 setter 方法
}
注意 :
@Value适合读取单个配置值,@ConfigurationProperties适合批量绑定一组配置到对象。
读取类型与存入类型
SpringBoot 在读取 properties 配置文件时,会自动将字符串值转换为目标类型。因为Spring内置了 类型转换器(Converter) 机制,会自动完成以下转换:
- 基本类型及其包装类 :
int、long、double、boolean等自动转换 - 日期时间类型 :支持
Date、LocalDate、LocalDateTime等 - 枚举类型:支持字符串到枚举的自动转换
- 自定义类型 :可通过实现
Converter接口自定义转换规则
注意事项
- 类型不匹配时 :如果配置值无法转换为目标类型,SpringBoot 会抛出
IllegalArgumentException - 空值处理 :配置值为空字符串时,基本类型会使用默认值(如
int为 0),包装类型为null - 日期格式 :日期类型默认使用 ISO 格式(
yyyy-MM-dd),可通过@DateTimeFormat注解自定义格式
java
@Component
public class TypeDemoConfig {
@Value("${my.age}")
private int age; // "25" → 25
@Value("${my.price}")
private double price; // "19.99" → 19.99
@Value("${my.enabled}")
private boolean enabled; // "true" → true
@Value("${my.name}")
private String name; // 直接作为字符串
@Value("${my.date}")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate date; // "2024-01-15" → 2024-01-15
}
properties 优缺点
优点
- 语法简单 :
key=value格式,易于理解和使用 - 兼容性好:Java 原生支持的配置文件格式
- 优先级高:与 yml 同时存在时,properties 优先级更高
缺点
- 冗余较多 :层级结构需要重复写前缀,如
spring.datasource.url - 不支持复杂类型:难以直接表达数组、集合、Map 等复杂数据结构
- 编码问题:默认使用 ISO-8859-1 编码,中文需要转义
yml
yml 基础语法
YAML(YAML Ain't Markup Language)是一种以数据为中心的配置文件格式,SpringBoot 推荐使用 application.yml 作为配置文件。其核心语法规则如下:
基本格式
yaml
key: value
注意:冒号后面必须有一个空格,否则解析会失败。
层级结构(缩进)
YAML 使用缩进表示层级关系,推荐使用 2 个空格缩进(不支持 Tab):
yaml
server:
port: 8080
servlet:
context-path: /api
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
常见数据类型
字符串
yaml
# 普通字符串(可不加引号)
name: 张三
# 带特殊字符时建议加引号
title: "Hello: World"
# 单引号不会转义特殊字符,双引号会转义
message1: 'Hello\nWorld' # 原样输出 Hello\nWorld
message2: "Hello\nWorld" # 换行输出 Hello World
数值类型
yaml
age: 25 # 整数
price: 19.99 # 浮点数
count: 1_000_000 # 支持下划线分隔(Java 8+)
布尔类型
yaml
enabled: true # true / false
debug: false
null 值
yaml
# 使用 ~ 或留空表示 null
value: ~ # 表示 null
emptyValue: # 留空也表示 null
空字符串
yaml
# 使用单引号或双引号包裹空字符串
empty: ''
blank: ""
复杂数据结构
定义对象(Map)
yaml
# 方式一:缩进写法
my:
key: hello
name: SpringBoot
age: 25
# 方式二:行内写法(JSON 风格)
my: {key: hello, name: SpringBoot, age: 25}
定义数组 / 集合(List)
yaml
# 方式一:缩进写法(使用 - )
hobbies:
- 读书
- 编程
- 运动
# 方式二:行内写法
hobbies: [读书, 编程, 运动]
定义对象数组
yaml
users:
- name: 张三
age: 25
- name: 李四
age: 30
# 行内写法
users: [{name: 张三, age: 25}, {name: 李四, age: 30}]
多文档块(---)
使用 --- 分隔多个 YAML 文档,常用于多环境配置:
yaml
# 默认配置
server:
port: 8080
---
# 开发环境配置
spring:
config:
activate:
on-profile: dev
server:
port: 8081
---
# 生产环境配置
spring:
config:
activate:
on-profile: prod
server:
port: 8080
锚点与引用(& 和 *)
YAML 支持锚点(&)和引用(*)来复用配置:
yaml
# 定义默认配置
default: &default
timeout: 5000
retry: 3
# 引用默认配置并覆盖部分属性
service1:
<<: *default
url: http://service1.com
service2:
<<: *default
url: http://service2.com
timeout: 10000 # 覆盖默认值
读取 yml 信息
SpringBoot 读取 yml 配置文件的方式与读取 properties 完全一致,同样支持 @Value 注解和 @ConfigurationProperties 注解两种方式。
方式一:使用 @Value 注解
java
@Component
public class YmlConfig {
@Value("${my.name}")
private String myName;
@Value("${my.age}")
private int myAge;
@Value("${my.enabled}")
private boolean enabled;
@Value("${my.price}")
private double price;
@Value("${my.hobbies}")
private String[] hobbies;
}
方式二:使用 @ConfigurationProperties 注解
java
@Component
@ConfigurationProperties(prefix = "my")
public class YmlProperties {
private String name;
private int age;
private boolean enabled;
private double price;
private List<String> hobbies;
private Map<String, String> config;
}
properties 和 yml 对比
SpringBoot 同时支持 application.properties 和 application.yml 两种配置文件格式,开发者可以根据项目需求选择使用。下面从多个维度进行对比分析。
加载机制
SpringBoot 在启动时会按以下顺序加载配置文件:
- 默认位置 :
classpath:/(即resources/目录下) - 文件名 :
application.properties或application.yml - 多环境配置 :
application-{profile}.properties或application-{profile}.yml
优先级规则
当 properties 和 yml 两种配置文件同时存在时,遵循以下规则:
| 规则 | 说明 |
|---|---|
| 同时生效 | 两个配置文件都会被加载,配置项取并集 |
| 冲突处理 | 如果两个文件中存在相同的配置项 ,以 properties 文件中的值为准 |
| 加载顺序 | SpringBoot 先加载 yml,再加载 properties,后者覆盖前者 |
语法对比
| 对比维度 | properties | yml |
|---|---|---|
| 语法格式 | key=value |
key: value(缩进表示层级) |
| 层级表达 | 使用 . 分隔,如 spring.datasource.url |
使用缩进,层级清晰 |
| 冗余度 | 层级越深,前缀重复越多 | 缩进结构,无重复前缀 |
| 数组/集合 | 不支持原生表达,需用 [0]、[1] 下标 |
原生支持 - 列表语法 |
| Map 结构 | 不支持原生表达 | 原生支持缩进或行内 Map |
| 多环境配置 | 通过 application-{profile}.properties |
通过 --- 多文档块或 application-{profile}.yml |
| 编码 | 默认 ISO-8859-1,中文需转义 | 默认 UTF-8,原生支持中文 |
yml 优缺点
优点
-
可读性强
YAML 使用缩进表示层级关系,结构清晰直观,比 properties 的
key=value格式更易阅读和维护,尤其适合配置项较多的场景。 -
支持复杂数据结构
原生支持数组、集合、Map、对象嵌套等复杂数据类型,无需像 properties 那样使用下标或特殊约定。
-
层级简洁无冗余
通过缩进表达层级,避免了 properties 中重复书写前缀的问题。
-
UTF-8 编码支持
默认使用 UTF-8 编码,原生支持中文,无需像 properties 那样对中文进行 Unicode 转义。
-
多文档块支持
使用
---分隔符可以在一个文件中管理多套环境的配置,减少文件数量。 -
锚点与引用
支持
&和*语法复用配置,减少重复代码。
缺点
- 对缩进敏感
缩进错误会导致解析失败或配置读取异常,且不支持 Tab 键(必须使用空格),对新手不够友好。
yaml
# 错误示例:缩进不一致
server:
port: 8080
servlet: # 缩进多了,解析会报错
context-path: /api
-
不适合简单配置
如果只有几个配置项,使用 yml 反而显得「杀鸡用牛刀」,properties 的
key=value更直接。 -
调试相对困难
yml 的解析错误信息有时不够直观,定位缩进问题需要逐行检查。
-
优先级低于 properties
当 properties 和 yml 同时存在且配置冲突时,以 properties 为准,yml 的配置会被覆盖。
-
不支持复杂表达式
properties 可以通过
${...}引用其他配置值,yml 虽然也支持,但在某些复杂场景下不如 properties 灵活。