前言

SpringBoot除了properties配置文件,还可以使用yaml配置文件,更为直观。


简介

YAML是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。

非常适合用来做以数据为中心的配置文件

用法

基本语法

  • key: value;kv之间有空格
  • 大小写敏感
  • 使用缩进表示层级关系
    • 缩进不允许使用tab,只允许空格
    • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • #:表示注释
  • 字符串无需加引号,如果要加,''""表示字符串内容 会被 转义/不转义

数据类型

  • 字面量:单个的、不可再分的值。

    date、boolean、string、number、null

    1
    key: value
  • 对象:键值对的集合。

    map、hash、set、object

    1
    2
    3
    4
    5
    6
    7
    8
    # 写法一(行内写法)
    key: [key1: value1, key2: value2, key3: value3]

    # 写法二
    key:
    key1: value1
    key2: value2
    key3: value3
  • 数组:一组按次序排列的值。

    array、list、queue

    1
    2
    3
    4
    5
    6
    7
    8
    # 写法一(行内写法)
    key: [value1, value2, value3]

    # 写法二
    key:
    - value1
    - value2
    - value3

示例

新建一个SpringBoot项目

在pom.xml配置文件中引入Lombok依赖。

src/main/java/boot目录下新建bean文件夹,并编写Pet和Person类:

Pet类

1
2
3
4
5
6
7
8
9
10
import lombok.Data;
import lombok.ToString;

@Data
@ToString
public class Pet {

private String name;
private Double weight;
}

Person类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Component
@ConfigurationProperties(prefix = "person")
@Data
@ToString
public class Person {

private String userName;
private Boolean boss;
private Date birth;
private Integer age;
private String[] interests;
private List<String> animal;
private Map<String, Object> score;
private Set<Double> salarys;
private Pet pet;
private Map<String, List<Pet>> allPets;
}

@ConfigurationProperties(prefix = "person"):标识配置文件中的类

src/main/resources目录下新建application.yaml配置文件(以配置Person类为例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
person:
userName: zhangsan
boss: true
birth: 2020/12/9
age: 18
interests:
- 篮球
- 足球
animal: [,]
score:
english: 80
math: 90
salarys: [9999.98, 9999.99]
pet:
name: 狗狗
weight: 32.34
allPets:
sick:
- {name: , weight: 12.23}
- name:
weight: 9.32
- name:
weight: 100.98
health: [{name: , weight: 128.23},{name: , weight: 124.23}]

需要注意petallPets属性的写法

测试,在src/main/java/boot目录下新建controller文件夹,并编写HelloController类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import boot.bean.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

@Autowired
Person person;

@RequestMapping("/person")
public Person person() {
String userName = person.getUserName();
System.out.println(userName);
return person;
}
}

启动服务,浏览器访问:http://localhost:8080/person

注意

字符串的引号包裹问题

关于字符串被''以及""包裹的问题:

单引号,转义

1
2
person:
userName: 'zhangsan \n lisi'

双引号,不转义

1
2
person:
userName: "zhangsan \n lisi"

如何理解转义与不转义:

原本\n即表示换行。单引号包裹后会将其转义,即令换行失效;双引号包裹不转义,即保留原本的换行效果。

properties与yaml、yml的优先级

当同时编写propertiesyamlyml配置文件,且其中内容有冲突时,加载顺序为:

yml > yaml > properties

由于后加载的会覆盖先加载的内容,所以在展示效果上来看,顺序为:

properties > yaml > yml

示例,在application.properties以及application.yaml配置文件中同时配置userName:

application.properties

1
person.userName=lisi

application.yaml

1
2
person:
userName: zhangsan

运行,效果如下:

补充

yaml配置文件的语法提示问题

在编写yaml配置文件时并不会有自动语法提示:

需要在pom.xml配置文件中引入如下依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
       <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>


<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

说明:

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

表示语法提示

1
2
3
4
5
6
7
8
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>

表示在打包时不添加语法提示的依赖

效果:

说明:

person.user-name-n即表示大写N


后记

使用yml/yaml配置文件更便于直观展示与理解。