今天针对 SpringBoot 的YAML 配置文件功能展开了学习,学习内容如下:
我们在使用 SpringBoot 传统配置:使用.properties文件,格式冗余、层级不清晰,大量重复前缀需要手动编写
使用 XML 配置:标签繁琐、结构冗长,配置数据不够直观
使用SpringBoot YAML:以数据为中心,语法简洁、层级清晰,完美替代 properties 与 XML,是 SpringBoot 官方推荐的配置格式
1. YAML 相关语法介绍
1.1 基本语法规则
- 大小写敏感
- 使用空格缩进表示层级关系
- key 与 value 之间必须加空格
- 字符串默认不加引号,特殊字符需用双引号
- 支持字面值、对象、数组、复合结构
1.2 支持数据类型
- 字面值:普通值(数字、字符串、布尔、日期)
- 对象:键值对集合
- 数组 / List/Set :用
-表示 - Map:键值对格式
1.3 YAML 松弛绑定规则
SpringBoot 采用宽松绑定,以下写法均可映射到userName:
user-name: 张三(烤肉串风格,推荐)userName: 张三(驼峰)user_name: 张三(下划线)USER_NAME: 张三(大写,环境变量推荐)
1.4 多环境配置
命名规范:application-{profile}.yml
-
开发:
application-dev.yml -
测试:
application-test.yml -
生产:
application-prod.ymlspring:
profiles:
active: dev
2. 实战
我们使用 YAML 完成:基础值配置、对象配置、集合配置、多环境切换、配置绑定实战。
2.1 引入依赖(配置绑定需要)
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
2.2 YAML 配置文件
application.yml
# 基础字面值
sysUser: 张三
age: 20
money: 123.45
birth: 1999/12/12
# 对象配置
com:
xzit:
model:
users:
name: 李四
gender: 男
age: 22
money: 234.22
birth: 1999/12/23
# 集合
likes:
- 打球
- 游泳
- 游戏
list: [aa, bb, cc]
map:
k1: v1
k2: v2
# 引用与随机值
server:
port: 8080
users:
customer:
url: localhost:${server.port}
teacher:
id: ${random.uuid}
age: ${random.int(30,50)}
2.3 实体类(YAML 绑定)
package com.xzit.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
@Data
@Component
@ConfigurationProperties(prefix = "com.xzit.model.users")
public class Users {
private String name;
private String gender;
private int age;
private double money;
private LocalDate birth;
}
2.4 Controller 测试读取
方式 1:@Value 读取单个值
package com.xzit.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
public class TestController {
@Value("${sysUser}")
private String sysUser;
@Value("${age}")
private int age;
@Value("${money}")
private double money;
@Value("${birth}")
private Date birth;
@GetMapping("/show")
public Object show(){
return sysUser + " | " + age + " | " + money + " | " + birth;
}
}
方式 2:绑定对象
package com.xzit.controller;
import com.xzit.model.Users;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class UsersController {
@Resource
private Users user;
@GetMapping("/user")
public Object showYaml(){
return user;
}
}
方式 3:Environment 读取
@Resource
private Environment env;
@GetMapping("/env")
public Object env(){
return env.getProperty("sysUser")
+ " | " + env.getProperty("com.xzit.model.users.name");
}
2.5 多环境配置演示
application-dev.yml
server:
port: 8080
application-prod.yml
server:
port: 8081
主配置激活:
spring:
profiles:
active: dev
3. YAML 常用功能总结
3.1 配置文件优先级
file:./config/file:./classpath:/config/classpath:/
3.2 自动重启排除配置
yaml
spring:
devtools:
restart:
exclude: static/**,public/**,templates/**
3.3 自定义配置文件名
启动参数指定:
plaintext
java -jar xxx.jar --spring.config.name=myconfig