yaml文件格式
语法格式
YAML(YAML Ain't Markup Language)
是一种数据序列化格式 , 具有容易阅读、容易与脚本语言交互、以数据为核心即重数据轻格式的特点
- YAML数据常见的文件扩展名有
yml格式(主流)和yaml格式
两种
YAML文件的语法格式
: key: value结构(kv之间有空格且区分大小写
),使用#
表示注释
- 使用缩进表示层级关系, 缩进也可以使用tab或空格,
缩进的空格数不重要
,只要相同层级的元素左对齐即可 - 字符串无需加引号,单引号会转义将/n作为字符串输出、双引号不会转义将\n作为换行输出
boolean: TRUE #TRUE,true,True,FALSE,false,False均可
float: 3.14 #6.8523015e+5 #支持科学计数法
int: 123 #0b1010_0111_0100_1010_1110 #支持二进制、八进制、十六进制
null: ~ #使用~表示null
string: HelloWorld #字符串可以直接书写
string2: "Hello World" #可以使用双引号包裹特殊字符
date: 2018-02-17 #日期必须使用yyyy-MM-dd格式
datetime: 2018-02-17T15:02:31+08:00 #时间和日期之间使用T连接,最后使用+代表时区
在书写字符串时,如果属性值中包含特殊字符
如转义字符,此时可以将数据字符串使用双引号包裹起来表示作为字符解析(默认不做处理)
lesson: "Spring\tboot\nlesson"
yaml格式表示数组
: 在属性名书写位置的下方使用-
作为数据开始符号(要与数据间使用空格分隔),一个-
号对应数组的一个元素
-
基本类型数组/list集合行内格式
: 数组/集合名: [元素1,元素2] -
对象数组/map集合行内格式
: 数组/集合名: [{对象1/键值对1},{对象2/键值对2}] -
对象和键值对的集合(如map)
: 对象/集合名: {k1: v1,k2: v2}
enterprise:
name: itcast
age: 16
subject:
- Java
- 前端
- 大数据
#数组书写行内格式
likes: [王者荣耀,刺激战场]
#对象数组格式一
users:
- name: Tom
age: 4
- name: Jerry
age: 5
#对象数组格式二
users:
-
name: Tom
age: 4
-
name: Jerry
age: 5
#对象数组行内格式
users2: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ]
读取yaml文件数据的三种方式
yaml
文件就是专门用来定义数据的, 这些数据大部分是给SpringBoot框架内部使用,当然我们自己也可以配置一些数据自己使用
读取单一数据
属性名引用方式: 先使用${一级属性名.二级属性名……}
读取yaml文件中定义的数据,然后使用@Value注解
把读取的值注入到Bean的属性上
- 缺点: 如果yaml文件中定义的数据量过大,需要在Bean中定义很多属性接收数据读取到的数据
读取全部数据
对象封装的方式
: 先声明一个Environment对象
用来封装yaml文件中的所有数据,然后使用@Autowired注解
把yaml文件中的数据注入到Environment对象中
- 通过
Environment的getProperties("一级属性名.二级属性名……")
方法从Environment对象中获取yaml文件中对应的数据 - 缺点: 每次拿数据都要调用
Environment对象的getProperties()方法
比较繁琐
读取对象数据
Bean对象封装的方式
: 首先向Spring容器中注册一个Bean
用来封装yaml中的一组数据 ,然后使用@ConfigurationProperties注解的prefix属性
指定读取yaml文件中的配置属性前缀,该前缀下的所有配置属性会封装到这个Bean对象中,默认按照配置属性名和Bean对象的属性名的映射关系进行封装
需求: 封装yaml配置文件中datasource配置项
的相关属性
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm db?serverTimezone=UTC
username: root
password: root
@Component
// 封装yaml文件中配置项前缀为datasource下的相关数据
@ConfigurationProperties(prefix ="datasource")
public class DataSource {
private String driverClassName;
private String url;
private String userName;
private String password;
}
需求: 封装yml配置文件中mycar配置项
的相关属性
mycar:
person:
#person.userName=zhangsan
userName: zhangsan
boss: false
birth: 2019/12/12 20:12:33
age: 18
#person.pet.name=tomcat
pet:
name: tomcat
weight: 23.4
interests: [篮球,游泳]
# List集合
animal:
- jerry
- mario
# Map集合
score: {english: 128,math: 136}
# set集合
salarys: [3999,4999.98,5999.99]
# Map集合
allPets:
sick:
- {name: tom}
- name: jerry
weight: 47}
health: [{name: mario,weight: 47}]
@ConfigurationProperties(prefix = "mycar")
@Component//普通组件
@Data
public class Person {
private String userName;
private Boolean boss;
private Date birth;
private Integer age;
private Pet pet;
private String[] interests;
private List<String> animal;
private Map<String, Object> score;
private Set<Double> salarys;
private Map<String, List<Pet>> allPets;
}
@Data
public class Pet {
private String name;
private Double weight;
}
yaml文件中的数据引用
当你在编写yaml数据时, 如果发现很多个配置项都具有相同的目录前缀 ,此时你可以先在yaml文件中定义一个配置属性并指定数据
,然后使用${属性名}
方式引用配置属性的值
center:
dataDir: D:/usr/local/fire/data
tmpDir: D:/usr/local/fire/tmp
logDir: D:/usr/local/fire/log
msgDir: D:/usr/local/fire/msgDir
#使用${属性名}方式引用属性值
baseDir: /usr/local/fire
center:
dataDir: ${baseDir}/data
tmpDir: ${baseDir}/tmp
logDir: ${baseDir}/log
msgDir: ${baseDir}/msgDir