写在前面

鉴于有人留言说想要学习SpringBoot相关的知识,我这里打算写一个SpringBoot系列的相关博文,目标呢是想让看了这一系列博文的同学呢,能够对SpringBoot略窥门径,这一系列的博文初步都定下来包括SpringBoot介绍、入门、配置、日志相关、web开发、数据访问、结合docker、缓存、消息队列、检索、任务安全、分布式等等一系列的博文,工作量很大,是个漫长的过程,每一步我都尽量详细,配上截图说明,也希望对看的同学真的有用。
单纯就是想分享技术博文,还想说一句就是,如果觉得有用,请点个关注、给个赞吧,也算对我来说是个宽慰,毕竟也得掉不少头发,嘿嘿嘿

系列文章传送条

详细SpringBoot教程之入门(一)
详细SpringBoot教程之入门(二)
详细SpringBoot教程之配置文件(一)
详细SpringBoot教程之配置文件(二)
详细SpringBoot教程之日志框架
详细SpringBoot教程之Web开发(一)
详细SpringBoot教程之Web开发(二)
详细SpringBoot教程之Web开发(三)
详细SpringBoot教程之数据访问
详细SpringBoot教程之启动配置原理
详细SpringBoot教程之缓存开发

配置文件

SpringBoot可以使用全局配置或者其他配置文件,并且我们在SpringBoot开发中会经常需要去配置某些模块的配置,这样有利于我们业务分离,理清逻辑关系。这个时候可能会说了,不是说SpringBoot的优点之一就是省去了繁琐的配置,为什么这里又要学配置呢?哈哈哈,省去了繁琐的配置是因为SpringBoot帮我们把所有配置弄好了默认,如果我们需要更改一些默认配置,当然需要我们自己手动更改呀。对于一些分布式大型项目,我们需要分各种端口,分各种环境,这些都需要我们修改。而且我们可能需要对可以重复利用的模块进行封装,然后在新项目中作为默认配置进新项目的时候,也需要知道如何进行SpringBoot的配置,所以还是很重要的。

说了这么多,我们开始来将SpringBoot的配置文件吧,在SpringBoot中配置文件有两种,一种是application.properties,另一种是application.yml,其中yml配置文件是在properties之后才有的。配置文件放在src/main/resources 目录或者类路径/config下,配置文件的作用,就是修改SpringBoot自动配置的默认值,SpringBoot底层都给我们自动配置好了很多默认值,我们就需要通过灵活的使用properties和yml来进行修改默认配置。

我们通过Idea向导帮我们创建的新项目,在Resources目录下面会帮我们自动生成一个properties配置文件,如下图
在这里插入图片描述
在resources目录下我们可以暂时手动再创建一个application.yml文件,为了比较学习他们的区别(说明一下的就是,二者可以同时存在,不过最终只会运行一个,一般默认运行application.properties,不过我们可以通过配置,在application.properties中同时应用yml,达到多个配置文件的目的),依旧在resources目录下,直接右键new->File,创建一个名为application.yml的文件,如下图
在这里插入图片描述
YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件,即以数据为中心,比json、xml等更加适合做配置文件,以前的项目大都是使用xml作为配置文件的。在全局配置文件中,可以对一些默认配置值进行修改,比如我们修改默认的端口号,我们如果使用xml作为配置文件,配置端口可能会是如下

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

发现了没有,xml会浪费大量的内容给标签的开闭上,那如果我们在SpringBoot项目中使用properties和yml设置端口,又该如何呢,如下,左边是yml,右边是properties,两者看起来是不是都很简略
在这里插入图片描述

YAML语法

properties我们常见,我这里说一下YAML的一些基本语法,想要深入的可以直接到网上查,应该有很多详细的文档,我这里只是说一下基本语法,方便我们后面的讲解。

基本语法

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • ‘#’表示注释

数据类型

YAML 支持以下几种数据类型:

  • 对象:键值对的集合,又称为映射/ 哈希 / 字典
  • 数组:一组按次序排列的值,又称为序列 / 列表
  • 字面量:单个的、不可再分的值

字面量写法

字面量是最基本的,不可再分的值,包括:字符串、布尔值、整数、浮点数、时间、Null、日期。使用一个例子来快速了解字面量的基本使用:

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
boolean: 
- TRUE #true,True都可以
- FALSE #false,False都可以
#例子:isEmpty: false
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
#例子:value: 3.14
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
#例子:value: 123
null:
nodeName: 'node'
parent: ~ #使用~表示null
#例子:value: ~
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
#例子:value: 哈哈
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
#例子:value: 2018-02-17
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和
#日期之间使用T连接,最后使用+代表时区

这里多说一些字符串,字符串默认不用加上单引号或者双引号。其中,双引号不会转移字符串里面的特殊字符,特殊字符会作为本身祥表示的意思,比如
name: “I am \n dbc” 输出 I am 换行 dbc
而单引号则会转义字符串里面的特殊字符,特殊字符最终只是一个普通的字符串数据,比如
name: “I am \n dbc” 输出 I am \n dbc

YAML 数组

以 - 开头的行表示构成一个数组:

1
2
3
4
num:
- A
- B
- C

YAML 支持多维数组,可以使用行内表示:key: [value1, value2, …]

YAML 对象

对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。
也可以使用 key:{key1: value1, key2: value2, …}。还可以使用缩进表示层级关系,如下:

1
2
3
key: 
child-key: value
child-key2: value2

较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value:

1
2
3
4
5
6
?  
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2

意思即对象的属性是一个数组 [complexkey1,complexkey2],对应的值也是一个数组 [complexvalue1,complexvalue2]
YMAL基本语法先讲到这里,需要深入了解的自行查阅其他教程。

配置文件注入简单案例

这里我们在application.yml中写入一些数据,就是写一个类的属性值以及对应的数值,如下
在这里插入图片描述
为了方便,我也把内容粘贴出来

1
2
3
4
5
6
7
8
9
10
11
12
person:
lastName: dbc
age: 22
boss: false
birth: 2017/12/12
maps: {k1: v2,k2: ;2}
lists:
- lisi
- dbc
dog:
name: 小狗
age: 12

写好了之后,我们创建一个Person类和一个Dog类,类中的属性值和配置文件中的属性值要一一对应,并在Person的类上加上@ConfigurationProperties注解,注解中的前缀填写我们在配置文件中的person,如下
在这里插入图片描述
在这里插入图片描述
因为我们需要将配置文件中配置的每一个属性值,映射到组件中,所以我们在Person类上添加一个@ConfigurationProperties,意思是告诉SpringBoot将本类中所有属性和配置文件中相关的配置进行绑定,prefix意思就是配置映射关系。这个时候发现编辑器提示如下
在这里插入图片描述
我这里直接把依赖粘贴出来,然后把这段依赖粘贴进pom.xml文件中,Idea会自动加载依赖,加载完依赖之后,原本红色的提示,变成 了绿色即可,如下

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

在这里插入图片描述
现在,完成了依赖的导入,也完成了配置文件的映射(即将配置文件和类进行了关联映射),映射之后,我们成这个映射为组件,不过现在我们只是完成了组件映射,我们还需要将这个组件注入到Spring容器中,因为只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能获取,所以我们还需要添加@Component,把类组件加到容器中,如图
在这里插入图片描述

测试案例

这样就完成了一个组件的注入,我们可以在容器中使用这个组件了,接下来我们进行单元测试了,细心的人会发现,我们使用Idea创建的SpringBoot项目中,在test目录下有一个java文件夹,被Idea标为绿色(如下),这个文件夹就是单元测试用的,当然我们手动创建的Maven项目,也可以手动配置,很简单,创建项目属性就可以了。接下来我们讲一下单元测试中的内容,如何使用
在这里插入图片描述
SpringBoot 的单元测试 ,可以在测试期间很方便的通过类似编码一样的方式,进行自动注入容器的功能,我们进入到那个DemoApplicationTests里面,其中有一个注解@SpringBootTest ,它标注是SpringBoot的单元测试。接着我们只需要在测试类中注入我们刚刚编写好的Person类,然后在方法中输出一下就可以了,毕竟我们只是检查一下我们编写的配置文件有没有成功配置好。执行之后在下方的日志中我们可以检查输出,测试类的内容和输出的日志结果如下图
在这里插入图片描述
在这里插入图片描述

使用properties完成案例

我们前面完成了使用yml类型的配置文件,进行映射注入,现在我们来试试使用properties类型的配置文件进行映射注入,其实不难,我们可以先将yml配置文件中的内容注释掉(当然不注释也可以,因为默认是读取properties)。我们开始编写properties里面的内容,会发现我们在properties中编写的时候,已经有person的提示了,是因为我们已经建类组件注入容器了,现在我们在里面编写内容如下
在这里插入图片描述
流程和yml中写的一样,获取配置文件值注入,导入处理器,注入写一个类,然后使用@ConfigurationProperties注解,注意了还得把类注入容器组件@Component
(在这里我们只要把内容写进properties就可以了,类、映射和注入在测试yml的时候已经写好了)。编写好之后运行测试,发现依旧能够读取到,结果如下
在这里插入图片描述
细心的人会发现,我们输出的结果出现了乱码,而出现乱码的原因是因为我们Idea默认的是utf-8编码,而properties用的是ASCII码,我们只要在Idea中将文件编码设置成Utf-8就可以了,如下
在这里插入图片描述
在这里插入图片描述

下一篇

写到这里篇幅有点长了,关于配置的剩下内容,我将在下一篇博文中进行讲解,可以先把上面学习的进行消化,加油,奥利给。