配置文件-Yaml 用法
# 150.配置文件-Yaml 用法
SpringBoot 除了支持 properties,还支持 yaml 的配置文件(文件后缀可以是 yaml,也可以是 yml)
# 简介
YAML 是 "YAML Ain't Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
非常适合用来做以数据为中心的配置文件
# 举个例子
我们先来看一个实际的例子,再讲解其语法:
person:
userName: zhangsan
boss: false
birth: 2019/12/12 20:12:33
age: 18
pet:
name: tomcat
weight: 23.4
interests: [篮球,游泳]
2
3
4
5
6
7
8
9
首先配置了一个 Person,然后后面缩进的内容,就是 Person 的信息,例如 username;
然后有个 pet 属性,后面又有缩进,就是 Pet 自己的信息,例如 name 和 weight。
# 基本语法
格式为
key: value
,注意 kv 之间有空格大小写敏感
使用缩进表示层级关系
缩进不允许使用 tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
#
表示注释字符串无需加引号,加不加都行;但要注意有特殊字符的情况:
- 如果加了单引号,不转义,例如
'\n'
,会作为几个字符; - 如果加了双引号,会转义,例如
"\n"
,会作为换行符 - 一般情况下,很少会遇到特殊字符的情况,了解即可
- 如果加了单引号,不转义,例如
数据类型
字面量:单个的、不可再分的值,例如 date、boolean、string、number、null
k: v
对象:键值对的集合。map、hash、set、object
# 行内写法:
k: {k1:v1,k2:v2,k3:v3}
#或
k:
k1: v1
k2: v2
k3: v3
2
3
4
5
6
7
8
数组:一组按次序排列的值。array、list、queue
# 行内写法:
k: [v1,v2,v3]
#或者
k:
- v1
- v2
- v3
2
3
4
5
6
7
8
# 实践
我们新建一个 JavaBean:
@Component
@ConfigurationProperties(prefix = "person")
@ToString
@Data
public class Person {
private String userName;
private Boolean boss;
private Date birth;
private Integer age;
private Pet pet;
private String[] interests;
private List<String> animal;
private Map<String, Object> score;
private Set<Double> salarys;
private Map<String, List<Pet>> allPets;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
给 Pet 对象加个 weight 属性:
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Pet {
private String name;
private Double weight;
}
2
3
4
5
6
7
8
然后在 resources 目录下新建一个 application.yml 文件:
person:
userName: zhangsan
boss: true
birth: 2022/5/20
age: 18
pet:
name: 小猫
weight: 2
interests: [sing, dance, rap, basketball]
animal: [阿猫, 阿狗]
score: #多行写法
english: 100
math: 120
chinese: 130
salarys:
- 1000
- 2000
allPets:
sick:
- {name: 小猫, weight: 15}
- name: 小狗2
weight: 3
- name: 小狗3
weight: 3
healthy:
- { name: 大猫, weight: 15 }
- { name: 大狗, weight: 15 }
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
打印:在主程序 MainApplication
中,获取和打印对象
System.out.println(run.getBean(Person.class));
运行结果:
Person(userName=zhangsan, boss=true, birth=Fri May 20 00:00:00 CST 2022, age=18, pet=Pet(name=小猫, weight=2.0), interests=[sing, dance, rap, basketball], animal=[阿猫, 阿狗], score={english=100, math=120, chinese=130}, salarys=[1000.0, 2000.0], allPets={sick=[Pet(name=小猫, weight=15.0), Pet(name=小狗2, weight=3.0), Pet(name=小狗3, weight=3.0)], healthy=[Pet(name=大猫, weight=15.0), Pet(name=大狗, weight=15.0)]})
# 配置 SpringBoot
除了配置数据方便之外,配置 SpringBoot 也方便,例如使用 yaml 之前,要配置 banner 和 cache:
spring.banner.image.bitdepth=4
spring.cache.type=redis
spring.cache.redis.time-to-live=11000
2
3
使用 yaml 后:可以清晰的看层级关系,而且可以少写一些前缀
spring:
banner:
image:
bitdepth: 4
cache:
type: redis
redis:
time-to-live: 11000
2
3
4
5
6
7
8
# 配置自动提示
我们在写 SpringBoot 本身的配置的时候,是有自动提示的:
而我们写自己的配置的时候,则没有(例如刚刚我们写 person 的数据),如果有提示会方便很多。其实我们打开 Person 类,可以看到上方有个提示,未配置注解处理器:
在 SpringBoot 文档中也有提示怎么配置(加个依赖)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2
3
4
5
这样就有自动提示了。以后可能有不少 JavaBean 和配置文件绑定的配置,有提示能提升效率
注意:虽然提示是 user-name,但是也能绑定到 userName 上
文档还说:这只是自动提示的依赖,打包的时候可以不引入该依赖,配置下 exclude 即可:
# 最后
如果既有 application.properties,也有 application.yml 文件,那么都会生效
已将本文源码上传到 Gitee (opens new window) 或 GitHub (opens new window) 的分支 demo9,读者可以通过切换分支来查看本文的示例代码
- 01
- 中国网络防火长城简史 转载10-12
- 03
- 公告:博客近期 RSS 相关问题10-02