概述
YAML是 JSON 的超集,因此,它是用于指定分层配置数据的便捷格式。只要 class 路径上有SnakeYAML library,SpringApplication class 就会自动支持 YAML 作为 properties 的替代。
编写规则
- 属性和值是大小写敏感,同JSON
- 通过缩进表示层次关系
- 字符串默认不需要加单引号或者双引号
YAML语法
基本语法
-
k:(空格)v:表示一对键值对(空格必须有);
-
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
-
server: port: 8081 path: /hello
值的写法
字面量:普通的值(数字、字符串、布尔)
- k: v:字面直接来写;
- 字符串默认不用加上单引号或者双引号;
- “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
- name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
- ‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
- name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
对象、Map(属性和值)(键值对)
-
k: v:在下一行来写对象的属性和值的关系;注意缩进
-
对象还是k: v的方式
-
friends: lastName: zhangsan age: 20
-
行内写法
-
friends: {lastName: zhangsan,age: 18}
数组(List、Set)
-
用- 值表示数组中的一个元素
-
pets: - cat - dog - pig
-
行内写法
-
pets: [cat,dog,pig]
使用YAML中的值
springboot在不同的环境下有默认的加载文件:
-
application 开发、测试、生产都会加载,公共的
-
application-dev 只在开发环境加载(调试src/main)
-
application-test 只在测试环境加载(调试src/test)
-
application-prod 只在生产环境加载(正式打包部署)
(1)使用@Value
myName: test
@RestController
public class UserController {
@Value("${myName}") //使用@Value注入配置文件中的值。${}要加引号
private String name;
@RequestMapping("/user")
public String handler(){
return name; //使用
}
}
- 不能直接 、 " { }、" 、"{ }"来使用配置文件中的值。
- 需要借助成员变量,使用@Value注入配置文件中的值,通过成员变量来引用。
- 不管成员变量是什么数据类型,${ }都需要加引号,会自动转换为需要的类型,注入。
- 对象、Map,通过.来注入单个字段, @Value("${student.name}")
- 数组、List,通过下标来注入单个元素,@Value("${city[0]}")
- 只能注入基本类型,不能直接直接注入整个对象、Map、数组、List。
(2)使用@ConfigurationProperties
注入对象、Map
使用@Value依次注入对象、Map的字段时,student.id,student.name,student.age,都有相同的前缀student,也可以这样来注入:
student:
id: 3434
name: lisi
age: 35
score: 99
@RestController
@ConfigurationProperties(prefix = "student") //设置前缀
public class UserController {
private int id;
private String name;
private int age;
private int score;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setScore(int score) {
this.score = score;
}
@RequestMapping("/user")
public String handler(){
return name; //使用
}
}
- 设置前缀、设置对应的成员变量、并提供对应的setter方法,会自动注入该字段的值。
(3) 综合示例
htzw-test-demo:
varmaplist:
key11:
- t1
- t2
- t3
key22:
- t11
- t22
- t33
list:
- topic1
- topic2
- topic3
maps: {key1: 'value1', key2: 'value2'}
@RestController
@ConfigurationProperties(prefix = "htzw-test-demo")
public class YamlController {
private List<String> list;
private Map<String,String> maps;
private Map<String,List<String>> varmaplist;
public void setList(List<String> list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public void setVarmaplist(Map<String, List<String>> varmaplist) {
this.varmaplist = varmaplist;
}
@GetMapping(value = "get")
public String getValue(){
System.out.println(list);
return list.get(1);
}
}