YAML
配置文件
SpringBoot使用一个全局的配置文件,配置文件名称是固定的
- application.properties
语法结构: key=value
key和value都要为字符串类型 - application.yaml
语法结构: key:空格 value
key为字符串类型,value可以为任意数据类型
配置文件的作用: 修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了
YAML概述
YAML是“YAML Ain't a Markup Language”(YAML不是一种标记语言)的递归缩写。
在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)
这种语言是以数据作为中心,而不是以标记语言作为中心。
yaml比xml和json更适合作为配置文件,想要使用
YAML语法
YAML语法如下:
- 空格不能省略
- 以缩进来控制层级关系,只要是左边对齐的一列数据就是同层级的关系
- 属性和值的大小写是十分敏感的
YAML常用写法
YAML支持以下三种数据结构
- 对象:键值对的集合
- 数组:一组按次序排列的值
- 字面值:单个的、不可拆分的值
- 字面值:普通的值[数字,布尔值,字符串]
k: 2
注意
“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
比如 :name: "kuang \n shen" 输出 :kuang 换行 shen
'' 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 :name: ‘kuang \n shen’ 输出 :kuang \n shen
- 对象、Map(键值对)
普通写法
student:
name: liang
age: 12
行内写法
student1: {name: zh,age: 2}
- 数组(List,set)
用 - 值表示数组中的一个元素,
pets:
- Dog
- cat
- pig
#行内写法
pets1: [Dog,cat,pig]
4.复合结构
person:
name: liang${random.uuid} #随机生成唯一通用符
age: ${random.int(1,150)}
date: 2001/4/10
isStudent: true
maps: {hobby: "睡觉",nature: "温和"}
lists: [code,music]
dog:
name: 旺财
age: 3
5.YAML组织结构
一个YAML文件可以由一个或多个文档组成,文档之间使用“—”作为分隔符,且各文档组成独立,互不干扰。
---
website:
name: bianchengbang
url: www.biancheng.net
---
website: {name: bianchengbang,url: www.biancheng.net}
pets:
-dog
-cat
-pig
---
pets: [dog,cat,pig]
name: "zhangsan \n lisi"
---
name: 'zhangsan \n lisi
注入配置文件
方式一:properties方式
- 在springboot项目中的resources目录下新建一个文件application.yaml
user1.name=chao
user1.age=3
user1.sex=男
- 编写一个实体类Dog
package com.liang.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:user.properties")
public class User {
@Value("${user1.name}") //从配置文件中取值
private String name;
@Value("#{9*2}") //#{SPEL} SpringEL表达式
private Integer age;
@Value("男") //字面值
private String sex;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
@PropertiesResource(“classpath:对应配置文件”)
加载指定的配置文件
3. 通过@Value给每个属性赋值
通过配置文件取值和SpringEL表达式、字母值给属性赋值
- 通过springboot的测试类来测试注入
import com.liang.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Springboot02EstablishApplicationTests {
//自动装配
@Autowired
private User user;
@Test
void contextLoads() {
System.out.println(user);;
}
}
结果:
方式二:yaml方式
- 编写一个复杂的实现类:Person类
@Component
public class Person {
private String name;
private Integer age;
private Date date;
private Boolean isStudent; //属性的名称正规一点
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
getter,setter方法,构造方法,toString方法
}
- 编写yaml配置文件
person:
name: liang${random.uuid} #随机生成唯一通用符
age: ${random.int(1,150)}
date: 2001/4/10
isStudent: true
maps: {hobby: "睡觉",nature: "温和"}
lists: [code,music]
dog:
name: 旺财
age: 3
- 给类中属性赋值
@Component //注册Bean到容器中
@ConfigurationProperties(prefix="person")
public class Person {
private String name;
private Integer age;
private Date date;
private Boolean isStudent; //属性的名称正规一点
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
getter,setter方法,构造方法,toString方法
}
@Configuration的作用是将配置文件的每一个属性,映射到这个组件
告诉SpringBoot将本类的所有属性和配置文件相关的配置进行绑定
参数prefix=“person”,将配置文件person下面的所有属性和定义的类一一对应
- 发现IDEA提示,springboot配置处理器未找到,导入一个依赖
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 测试
指定配置文件绑定成功!
配置文件占位符
person:
name: Liang${random.uuid} # 随机uuid
age: ${random.int} # 随机int
happy: false
birth: 2000/01/01
maps: {k1: v1,k2: v2}
lists:
- code
- girl
- music
dog:
name: ${person.hello:other}_旺财
age: 1
回顾properties配置
通过上面的对比,我们知道了yaml格式的好处,开发中也是常用的,也是springboot推荐使用的。properties给属性赋值时,要对每一个属性单独赋值,显得不灵活,而且properties在写中文的时候,会有乱码,我们需要在IDEA设置编码格式为UTF-8;settings-FileEncodings中配置
对比小结
@Value不太友好,需要给每个属性单独注解赋值
- @ConfigurationProperties只需要写一次,@Value需要每个字段添加
- 松散绑定,像在yaml文件中我们写成last-name,而我们的实体类写的是lastName,是能够完成绑定属性值的。
- JSR303数据校验,这个是在字段中增加一层过滤器验证,保证数据的合法性。
- 复杂类型封装,yaml可以封装对象,使用value就不支持。
结论
配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties