YAML-grammar

YAML语法


YAML定义

在学习Spring Boot时,发现Spring Boot的全局配置文件有两种类型,分别是:

  • application.properties
  • application.yml

以上两种文件都放在/project_name/src/main/resources目录下而且文件名是固定的。其中 application.ymlapplication.yaml 是YAML文件。

  • YAML(YAML Ain’t Markup Language)

    • YAML A Markup Language:是一个标记语言

    • YAML isn’t Markup Language:不是一个标记语言;

YAML是以数据为核心,比json、xml更适合做配置文件。

YAML:

1
2
server:
port: 8081

XML:

1
2
3
<server>
<port>8081</port>
</server>

YAML语法

基本语法

key: value -> 表示一对键值对(注意value和前面的key:之间有一个空格)

以空格的缩进来控制层级关系:只要key能左对齐,就是同一层级

1
2
3
server:
port: 8081
path: example

属性和值也是大小写敏感。

值的写法

字面量:(数字、字符串、布尔类型等)

字面量都可以直接写在value的位置,其中字符串默认不用加单双引号。

不过你也可以给字符串加上引号:

  • 如果你给字符串加双引号 "" 那么,不会转义特殊字符。
    • “\n”会表示为换行。
  • 如果你给字符串加单引号 '' 那么,会转义特殊字符。
    • “\n”只是 \n组成的字符串。

对象、Map(属性和值)(键值对)

基本写法:

1
2
3
object:
name: example
status: test

行内写法:

1
object: {name: example, status: test}

数组(List,Set)

基本写法:

1
2
3
4
pets:
- cat
- dog
- pig

行内写法:

1
pets: {cat, dog, pig}

在Spring Boot中的案例

我们先写好一个被配置文件配置的类

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package SpringBoot.HelloSpringBoot.YAMLtest;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "john")
public class Person {

private String lastName;
private Integer age;
private Boolean boss;
private Date birth;

private Map<String, Object> map;
private List<Object> lists;
private Dog dog;
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getBoss() {
return boss;
}
public void setBoss(Boolean boss) {
this.boss = boss;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
@Override
public String toString() {
return "Person [lastName=" + lastName + ", age=" + age + ", boss=" + boss + ", birth=" + birth + ", map=" + map
+ ", lists=" + lists + ", dog=" + dog + "]";
}

}
  • @Component代表这个类是一个Spring组件
  • @ConfigurationProperties(prefix = "john")代表这个类中的值由配置文件中的john来配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server:
port: 8081

john:
lastName: John-Smith
age: 18
boss: false
birth: 2001/4/4
map:
k1: v1
k2: v2
lists:
- Mike
- Tom
- Siri
dog:
name: littleDog
age: 2

上面配置了serverjohnserver将这个project移到8081端口,john用来配置我们上面的类。

然后用一个controller来控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package SpringBoot.HelloSpringBoot.HelloTest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import SpringBoot.HelloSpringBoot.YAMLtest.Person;

@Controller
public class TestController {

@Autowired
Person person;

@ResponseBody
@RequestMapping("/test")
public String test() {
return person.toString();
}


}
  • @Controller代表这个类是一个Spring控制器
  • @Autowired代表让Spring自动注入一个person
  • @ResponseBody代表直接将文本返回给浏览器
  • @RequestMapping("/test")代表相应/test路径
  • @ResponseBody@Controller等同于一个@RestController