Springboot中的yaml语法格式以及读取数据
1.SpringBoot基础配置
SpringBoot没有具体的功能,它在辅助加快Spring程序的开发效率,但是新的问题又来了,如果不想用已经写好的默认配置,该如何干预呢?这就是这一章咱们要研究的问题。
- 第一是pom.xml文件,设置项目的依赖
- 第二是引导类,这个是执行SpringBoot程序的入口
- 第三是在resources目录下面有一个空白的文件,叫做application.properties。(做配置的地方)
1.1properties格式的文件属性配置
SpringBoot通过配置文件application.properties就可以修改默认的配置,那咱们就先找个简单的配置下手,当前访问tomcat的默认端口是8080,我们先改成80,通过这个操作来熟悉一下SpringBoot的配置格式是什么样的。(就是把8080改成80)

properties格式的文件书写规范是key=value
1 | server.port=80 |
意味着以后所有的配置都可以写在这一个文件中呢?是的,简化开发者配置的书写位置,集中管理。妙啊,妈妈再也不用担心我找不到配置文件了。
总结
- SpringBoot默认配置文件是application.properties
做完了端口的配置,趁热打铁,再做几个配置,目前项目启动时会显示一些日志信息,就来改一改这里面的一些设置。
关闭运行日志图表(banner)
1 | spring.main.banner-mode=off |
设置运行日志的显示级别
1 | logging.level.root=debug |
我们现在配置了3个信息,但是又有新的问题了。这个配置是随便写的吗?什么都能配?有没有一个东西显示所有能配置的项呢?此外这个配置和什么东西有关呢?会不会因为我写了什么东西以后才可以写什么配置呢?比如我现在没有写数据库相关的东西,能否配置数据呢?一个一个来,先说第一个问题,都能配置什么。
打开SpringBoot的官网,找到SpringBoot官方文档,打开查看附录中的Application Properties就可以获取到对应的配置项了,网址奉上:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
能写什么的问题解决了,再来说第二个问题,这个配置项和什么有关。在pom中注释掉导入的spring-boot-starter-web,然后刷新工程,你会发现配置的提示消失了。闹了半天是设定使用了什么技术才能做什么配置。也合理,不然配置的东西都没有使用对应技术,配了也是白配。
温馨提示
所有的starter中都会依赖下面这个starter,叫做spring-boot-starter。这个starter是所有的SpringBoot的starter的基础依赖,里面定义了SpringBoot相关的基础配置,关于这个starter我们到开发应用篇和原理篇中再深入讲解。
1 | <dependency> |
总结
- SpringBoot中导入对应starter后,提供对应配置属性
- 书写SpringBoot配置采用关键字+提示形式书写
1.2配置文件分类
SpringBoot相关的配置有properties格式,有没有更简便的配置格式提供给开发者使用。有吗?还真有。
properties格式
yml格式(主流格式)
yaml格式
一看到全新的文件格式,各位小伙伴肯定想,这下又要学习新的语法格式了。怎么说呢?从知识角度来说,要学,从开发角度来说,不用学。为什么呢?因为SpringBoot的配置在Idea工具下有提示啊,跟着提示走就行了。下面列举三种不同文件格式配置相同的属性范例,先了解一下
application.properties(properties格式)
1 | server.port=80 |
- application.yml(yml格式)
1 | server: |
- application.yaml(yaml格式)
1 | server: |
配置文件优先级
1 | application.properties > application.yml > application.yaml |
总结
- 配置文件间的加载优先级 properties(最高)> yml > yaml(最低)
- 不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留
如果找不到配置文件可以:指定SpringBoot配置文件
- Setting → Project Structure → Facets
- 选中对应项目/工程
- Customize Spring Boot
- 选择配置文件
1.3yaml文件(yaml语法格式)
SpringBoot的配置以后主要使用yml结尾的这种文件格式,并且在书写时可以通过提示的形式加载正确的格式。但是这种文件还是有严格的书写格式要求的。下面就来说一下具体的语法格式。
YAML(YAML Ain’t Markup Language),一种数据序列化格式。具有容易阅读、容易与脚本语言交互、以数据为核心,重数据轻格式的特点。常见的文件扩展名有两种:
- .yml格式(主流)
- .yaml格式
语法格式要求具体如下:
- 大小写敏感 (大小写区分)
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
- 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)(记得空格)
- #号 表示注释
但是idea有提示,熟悉就好了
核心的一条规则要记住,数据前面要加空格与冒号隔开
下面列出常见的数据书写格式,熟悉一下
1 | boolean: TRUE #TRUE,true,True,FALSE,false,False均可 |
此外,yaml格式中也可以表示数组,在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔
1 | likes: |
简单的一些用法
- ```yaml
subject:Java
前端
大数据
enterprise:
name: itcast
age: 16
subject:- Java
- 前端
- 大数据
likes: [王者荣耀,刺激战场] #数组书写缩略格式
users: #对象数组格式一
name: Tom
age: 4
name: Jerry
age: 5
users: #对象数组格式二name: Tom
age: 4name: Jerry
age: 5
users2: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ] #对象数组缩略格式
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
**总结**
1. yaml语法规则
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
- 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
- #号 表示注释
2. 注意属性名冒号后面与数据之间有一个**空格**
3. 字面值、对象数据格式、数组数据格式
# 1.4yaml数据读取(这节看图理解)
对于yaml文件中的数据,**不光能配置,同时也可以当一个小型的数据库**,里面保存有若干数据,每个数据都有一个独立的名字,如果你想读取里面的数据,肯定是支持的,下面就介绍3种读取数据的方式
### 1.4.1读取单一数据
yaml中保存的单个数据,可以使用Spring中的注解直接读取,使用@Value可以读取单个数据,属性名引用方式:<font color="#ff0000"><b>${一级属性名.二级属性名……}</b></font>
这个是SpEL(Spring Expression Language),即**Spring表达式语言**
**\#{…}和${…}区别**
* **#{…} 用于执行SpEl表达式,并将内容赋值给属性**
* **${…} 主要用于加载外部属性文件中的值**
* **\#{…} 和${…} 可以混合使用,但是必须#{}外面,${}在里面**

**记得使用@Value注解时,要将该注入写在某一个指定的Spring管控的bean的属性名上方。现在就可以读取到对应的单一数据行了,遇到数据就用中括号**
**总结**
1. 使用@Value配合SpEL读取单个数据
2. 如果数据存在多层级,依次书写层级名称即可
---
**yaml数据读取引用属性**:

### 1.4.2读取全部数据
读取单一数据可以解决读取数据的问题,但是如果定义的数据量过大,这么一个一个书写肯定会累死人的,SpringBoot提供了一个对象,能够把所有的数据都封装到这一个对象中,这个对象叫做**Environment**,使用**自动装配注解(@Autowired )**可以将所有的yaml数据封装到这个对象中

数据封装到了**Environment**对象中,获取属性时,通过Environment的接口操作进行,具体方法时getProperties(String),参数填写属性名即可
**总结**
1. **使用Environment对象封装全部配置信息**
2. **使用@Autowired自动装配数据到Environment对象中**
### 1.4.3读取对象数据 (正常都是用这个,针对性的封装,主流模式)
单一数据读取书写比较繁琐,全数据封装又封装的太厉害了,每次拿数据还要一个一个的getProperties(),总之用起来都不是很舒服。由于Java是一个面向对象的语言,很多情况下,我们会将一组数据封装成一个对象。SpringBoot也提供了可以将一组yaml对象数据封装一个Java对象的操作
**首先定义一个对象,并将该对象纳入Spring管控的范围,也就是定义成一个bean,然后使用注解@ConfigurationProperties指定该对象加载哪一组yaml中配置的信息,(操作步骤三步)。**
1.定义数据模型封装yaml文件中对应的数据:**Enterprise类**
2.定义为spirng管控的bean:**@Component**
3.指定加载的数据:**@ConfigurationProperties**

---
**@Component**:(把普通pojo实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>)泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。(受spring控制,才能由spring把数据给你)
**@ConfigurationProperties**:Spring源码中大量使用了ConfigurationProperties注解,比如`server.port`就是由该注解获取到的,通过与其他注解配合使用,能够实现Bean的按需配置。该注解有一个prefix属性,通过指定的前缀,绑定配置文件中的配置,通过如下源码可以看出,该注解可以放在类上,也可以放在方法上。
---
这个**@ConfigurationProperties**必须告诉他加载的数据前缀是什么,这样当前前缀下的所有属性就封装到这个对象中。记得数据属性名要与对象的变量名一一对应啊,不然没法封装。其实以后如果你要定义一组数据自己使用,就可以先写一个对象,然后定义好属性,下面到配置中根据这个格式书写即可。

**总结**
1. **使用@ConfigurationProperties注解绑定配置信息到封装类中**
2. **封装类需要定义为Spring管理的bean,否则无法进行属性注入@Component**
## 1.5**yaml文件中的数据引用:**
如果你在书写yaml数据时,经常出现如下现象,比如很多个文件都具有相同的目录前缀
```YAML
center:
dataDir: /usr/local/fire/data
tmpDir: /usr/local/fire/tmp
logDir: /usr/local/fire/log
msgDir: /usr/local/fire/msgDir
或者
1 | center: |
这个时候你可以使用引用格式来定义数据,其实就是搞了个变量名,然后引用变量了,格式如下:
1 | baseDir: /usr/local/fire |
还有一个注意事项,在书写字符串时,如果需要使用转义字符,需要将数据字符串使用双引号包裹起来
1 | lesson: "Spring\tboot\nlesson" |
总结
- 在配置文件中可以使用${属性名}方式引用属性值
- 如果属性中出现特殊字符,可以使用双引号包裹起来作为字符解析





