Spring Boot中的配置文件有两个格式:properties和yaml。一般情况下,两者可以随意使用。但是因为properties文件是无序的,yaml文件配置是有序的。所以当我们的配置文件有顺序要求或较复杂的数据结构时,就需要使用到yaml文件。
需要注意的是:
yaml配置文件目前不支持@PropertySource
,Spring Boot默认只加载名为application的配置文件。
一、YAML简介
YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。
它的基本语法规则如下。
- 大小写敏感。
- 使用缩进表示层级关系。
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要(一般2个或4个空格),只要相同层级的元素左侧对齐即可。
- # 表示注释,从这个字符一直到行尾,都会被解析器忽略。
YAML 支持的数据结构有三种:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 常量(scalars):单个的、不可再分的值
二、数据格式
(一)常量
YAML中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间。
常量的基本使用例子
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
(二)数组
一个数据项:一个短横线后
加一个空格
加内容
hobbies:
- Java
- Basketball
另一种写法:
#表示[[Java,Basketball]]
-
- Java
- Basketball
一个相对复杂的例子:
#表示companies:[[id:1,name:company1,price:200w],[id:2,name:company2,price:500w]]
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W
YAML中支持流式(flow)的方式表示数组,如:
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
(三)对象
格式为key: value。
注意:冒号后面要加一个空格
使用缩进表示层级关系:
key:
child-key: value
child-key2: value2
YAML中同样支持流式(flow)语法表示对象,如:
key: {child-key: value, child-key2: value2}
对于复杂的对象格式,可以使用问号加一个空格代表一个复杂的key,配合一个冒号加一个空格代表一个value:
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
含义为:对象的属性是一个数组[complexkey1,complexkey2],对应的值也是一个数组[complexvalue1,complexvalue2]
三、Spring Boot中使用示例
使用前注意:
找到IDEA的Settings中的Editor->File Encodings,将图中标红的配置都统一设置为UTF-8
,最后点击apply应用和ok。
yaml配置文件的位置:
application.yaml在Spring Boot中可以写在四个不同的位置,分别是如下位置
- 项目根目录下的config目录中
- 项目根目录下
- classpath下的config目录中
- classpath目录下
四个位置中的application.yaml文件的优先级按照上面列出的顺序依次降低。即如果有同一个属性在四个文件中都出现了,以优先级高的为准。
(一)配置服务器
首先在resources目录中新建一个application.yaml,删除application.properties
配置代码示例:
server:
port: 8082
servlet:
context-path: /test
注意:缩进和冒号后的空格
启动项目,配置成功
(二)属性注入示例
首先创建Student类
@Component
public class Student {
private long id;
private List<String> hobbies;
private List<Teacher> teachers;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
public List<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(List<Teacher> teachers) {
this.teachers = teachers;
}
}
新建Teacher类:
@Component
public class Teacher {
private long id;
private String name;
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
application.yaml文件内容如下:
#容器配置
server:
port: 8082
servlet:
context-path: /test
#属性注入
student:
id: 1
hobbies:
- 唱
- 跳
- rap
- 打篮球
teachers:
- id: 1
name: 语文老师
- id: 2
name: 数学老师
在Student类中加入@ConfigurationProperties(“student”)引入配置文件的属性,这样项目启动后对应属性就注入到该类中
新建ShowController类
@RestController
public class ShowController {
@Autowired
Student student;
@RequestMapping(value="/show",produces = "text/plain;charset=UTF-8")
public String show(){
return "学号:"+student.getId()+"爱好:"+student.getHobbies()+"老师:"+student.getTeachers();
}
}
启动项目,浏览器访问,效果如下:
参考博客:
https://www.cnblogs.com/sddai/p/9626392.html
https://www.jianshu.com/p/97222440cd08