文章目录
3 YAML语法
3.1 YAML简介
- YAML:一种表达数据序列化的标记语言,它有两种全称,用来说明YAML的本质和作用
- Yet Another Markup Language,“另一种标记语言”,说明了它本质是一种标记语言
- YAML Ain’t Markup Language,“YAML不是一种标记语言”,强调了这种语言以数据为中心
3.2 基础语法
3.2.1 语法特点
语法特点
- 空格要求严格
- 大小写敏感
- 缩进来表示层级关系
3.2.2 注释
- 注释
格式:#后接注释内容
注意:YAML只有单行注释
3.2.3 字面量
格式:k: v
注意:
- 冒号
:
之后有空格- 字符串默认不需要双引号或者单引号,如果加上单引号或者双引号,效果如下:
- 双引号
""
:会转义字符串中的特殊字符- 单引号
''
:不会转义字符串中的特殊字符,字符串是什么样子还是什么样子
3.3.3 对象/Map(键值对)
多行格式:
k:
k1: v1
k2: v2
单行格式:
k: {k1: v1,k1: v2}
注意:
- 多行使用缩进来表示层级关系,缩进只能用空格,不能用制表键TAB
- 单行用
{}
,并使用逗号+空格的形式分开(,
)
实例
# 多行
student:
name: Tom
age: 18
# 单行
teacher: {name: mike, age: 30}
3.3.4 数组(list、set)
多行格式
a:
- v1
- v2
- v3
单行格式
a: [v1, v2, v3]
注意
- 多行格式用分隔符
-
+空格表示一个成员- 单行格式用中括号
[]
,并用逗号+空格分隔各成员(,
)
实例
# 实例
# 多行
pet:
- cat
- dog
- pig
# 单行
fruit: [apple, watermelon, pineaple]
4 YAML给属性赋值
4.1 使用@Value
赋值
- 创建一个实体类
Dog
,使用@Value
给Dog
对象赋值
package com.cap.springboottutorial01.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Dog {
@Value("旺财")
private String name;
@Value("6")
private int age;
}
- 在测试方法中取到该Bean
package com.cap.springboottutorial01;
import com.cap.springboottutorial01.pojo.Dog;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Springboottutorial01ApplicationTests {
@Autowired
private Dog dog;
@Test
void contextLoads() {
System.out.println(dog);
}
}
- 结果得到
Dog(name=旺财, age=6)
4.2 使用YAML给属性赋值
- 导入依赖
<!-- 导入配置文件依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 新建一个
Person
类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component("person")
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private Boolean marries;
private Date birth;
private Map<String,Integer> gradeMap;
private List<String> bookList;
private String[] pens;
private Dog dog;
}
@ConfigurationProperties(prefix = "person")
使用该注解可以引用配置文件中的属性
prefix
指该属性的属性名
- 编写配置文件
application.yaml
person:
name: Tom
age: 18
marries: false
birth: 2002/07/20
gradeMap: {English: 99, Mathematics: 88}
bookList: [西游记, 水浒传, 三国演义, 红楼梦]
pens:
- 钢笔
- 铅笔
- 圆珠笔
dog:
name: 小黑
age: 5
map不能使用中文
- 测试
@SpringBootTest
class Springboottutorial01ApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
- 结果得到
Person(
name=Tom,
age=18,
marries=false,
birth=Sat Jul 20 00:00:00 CST 2002,
gradeMap={
English=99,
Mathematics=88
},
bookList=[西游记, 水浒传, 三国演义, 红楼梦],
pens=[钢笔, 铅笔, 圆珠笔],
dog=Dog{
name='小黑',
age=5
})
4.3 使用Properties给属性赋值(对比使用)
- 新建
Student
类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "student")
@PropertySource("classpath:student-info.properties")
public class Student {
private String name;
private String age;
private Dog dog;
}
- 新建
student-info.properties
student.name=Tom
student.age=18
student.dog.name=旺财
student.dog.age=6
- 测试方法
@SpringBootTest
class Springboottutorial01ApplicationTests {
@Autowired
private Student student;
@Test
void contextLoads() {
System.out.println(student);
}
}
- 结果得到:
Student(name=Tom, age=18, dog=Dog{name='Íú²Æ', age=6})
可以看到properties会乱码,我们需要去Settings>Editor>File Encodings设置
再次运行测试方法得到
Student(name=Tom, age=18, dog=Dog{name='旺财', age=6})
4.4 YAML和其他两种赋值方式的比较
- 相比于Properties配置文件赋值,YAML可以更加轻松得简化对象、数组等的赋值,也具有良好的阅读性
- YAML和
@Value
赋值相比
因此,实践中更推荐YAML!