前言
在spring漫长的历史中,配置一直是新手入门的头疼问题。往往只能从网上找到一个demo,再将里面的内容修改为自己的数据。但是一旦出现新的需求,往往不知道如何修改配置。spring经历了从xml到properties文件再到yml文件乃至利用java代码进行配置,努力将配置文件保持对用户友好。但是在这个可读性增强的过程中其实学习曲线也在一定程度的上升。
所以这篇文章的目的并不是教会你去配置spring项目,而是要教会你如何去读懂spring配置文件。
spring的其他配置方式
除去YAML,spring可以通过XML,JAVA和properties文件进行配置。这些配置都将不是本文的重点说明内容。但是在这里要稍微提一下application.properties文件配置项目。application.properties文件应当放于resources文件夹之下。如果不是用maven创建项目的话,只需要将一个文件夹的属性更改为resource即可。
当然,spring也支持多个properties文件。比如想要创建一个validation.properties文件用以记录验证项,那么也只需要将该文件放在resources文件夹之下。示例目录如下:
application.properties中使用的配置格式如下:
这里描述了THYMELEAF配置,采用x.y.z=value
的格式。我们只需要知道一下形式,无需了解具体的内容是什么。在下一次教程中涉及THYMELEAF时会具体讲解。
从这个截图可以看出,会有相当多的重复的namespace。比如spring.thymeleaf前缀出现了许多次。这些冗余的内容也导致该文档的可读性不是很高。再加上*.properties
文件的默认编码为iso
,因此如果配置文件中存在中文的话,读出来就是乱码。虽然也有方式改变其编码格式,但是使用yaml配置文件的可以将上述两个问题全部解决。
YAML
YAML全名YAML Ain’t Markup Language
。YAML因为其简单的文本格式使其可以运用于各种场景,包括配置文件,网络信息传输和对象持久化等。Spring也正是基于这一点支持其作为自己的配置文件格式。YAML为了实现至简性,减去了很多结构化元素,努力将文本的可读性最大化。与之相比,XML和JSON都显得复杂。更为有趣的一点时,YAML其实是JSON的一个父集,也就是说,所有的标准的JSON文件都可以被YAML解读。
YAML语法速成
yaml将数据分为三种基本类型:
- mappings:hashes/dictionaries
- sequences:arrays/list
- scalars:strings/numbers
和JSON相似,YAML同样采用键值对的方式来标注数据。结合上面讲的数据类型,先整理一下基本的YAML语法。
key: value
:所有的mappings类型都采用键值对的形式,如name: rale
。这里需要注意冒号后面需要加一个空格符。#this is a comment
: 一行中以#
开始的语句将会被标记为注释-
:可以用来标注块区域,也可以作为列表的展示
列表
american:
- Boston Red Sox
- Detroit Tigers
- New York Yankees
national:
- New York Mets
- Chicago Cubs
- Atlanta Braves
区域
-
name: Mark McGwire
hr: 65
avg: 0.278
-
name: Sammy Sosa
hr: 63
avg: 0.288
这里尤其要注意的是,yaml不支持tab键
,所以一定要手动敲空格进行缩进。
当然啦,正如我们之前说的,yaml和json是兼容的,所以你也可以采取类json形式进行定义,如下所示:
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
hr: 63,
avg: 0.288
}
文档分割符
---
与...
:这两个符号分别代表文档的开始和结束。也就是说一个yml文件中可以包含多个yml文档。你可能会困惑,为什么要这样设计呢?下面我们就来介绍一个场景。
假设一个开发团队拥有多个开发环境,分别是测试环境,部署环境和上线环境。这意味着不同的服务器的ip以及数据库的ip等等。如果我们每次都在上线的时候重新修改这些配置,然后在开发的时候再更改为测试环境,未免太过麻烦。更可怕的是万一某一次忘记了切换环境,可能直接导致运行中的系统崩溃。因此我们可以用yml配置多个环境,分别标记各个环境的名称。用---
符号分割开来。再用一个最高配置决定究竟使用哪个环境。从而将切换的成本降至最低。示例如下:
spring:
profiles:
active: test
---
spring:
profiles: dev
server:
port: 8088
---
spring:
profiles:test
server:
port:8080
在这个配置中采用了test版本的配置,因此服务器的端口号为8080。
yaml用空格缩进的方式来说明不同级别的键,在上例中等价的application.properties配置为spring.profiles.active=test
。除此以外,相同级别的键不可以重复。
&与*
假设在配置文件中一个属性需要被多次赋值,那么我们如何对这个属性进行引用呢?
&
和*
: 以&开头的内容对这个属性命名,在使用*对命名进行引用
---
hr:
- Mark McGwire
# Following node labeled SS
- &SS Sammy Sosa
rbi:
- *SS # Subsequent occurrence
- Ken Griffey
在这里将Sammy Sosa命名为SS再用*SS对其进行调用
?
如果现在有一个场景,说多家店都有sugar这个商品,但是我们不想将sugar作为key,而是想将这些商店作为key,该怎么实现呢?
我们肯定会直接想到将每个商店作为一个key,并且将其值设置为sugar,如下:
store1: sugar
store2: sugar
yml还允许另一种方式,也就是将列表等复杂类型作为key,但是需要用?
进行标记。这里需要注意的是,标记符为?+空格
? -store1
-store2
:
sugar
换行 |或>
假设现在你想发送一个新年的问候,你想将这段问候在配置文件中预先定义一下。但是目前你只能将它作为一整行的string读取出来再展示给用户,这样可能严重拉低你们公司的逼格。为了设计一个好看的问候语,你必须将内容换行保证其良好的可读性。那么yml考虑到了这个特性,也允许你是用|
或是_
来标注接下来的内容将涉及跨行
---
greetings: >
My dearest friend
We wish you a happy new year!
Yours Sincerely
跨行将会在遇到下一个和key同等级的key时结束。除此以外,所有的缩进都将会被保留。
标准类型
在默认情况下,yaml将会根据应用情景将对应的值转换为各种类型,如int或是string。当然,它也允许我们在文档中强制定义类型。但是这种情况在配置文件中很少遇到,往往常见于消息传递过程中,因此在本教程中将会忽略。想详细了解的童鞋可以前往文末的链接中进行了解。
YAML替换application.properties文件
我们再次引用上文的例子,在application.properties中我们进行了如下的配置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.cache=false
spring.thymeleaf.mode=LEGACYHTML5
我们需要将该文件转化为对应的application.yml文件,只需要在resources文件夹之下新建application.yml文件,在其中加入以下内容:
spring:
thymeleaf:
prefix: classpath:/templates/
encoding: UTF-8
content-type: text/html
cache: false
mode: LEGACYHTML5
别忘了将原有的application.properties文件删除,不然新的配置文件可能不会生效。
总结
这只是yaml的冰山一角,但是了解这一角已经我们足够我们读懂配置文件并将原先的properties后缀文件进行优化。更多的内容有机会的话将在后序的内容中更新。这个教程的最终目的是实现一个完整的登录注册功能,涉及的内容包括spring security, spring validation, thymeleaf, yaml, restful api
等。楼主也是一边学习一边更新博客。项目的地址位于git@github.com:raledong/SimpleLogin.git
,目前还只是一个雏形,它将随着博客的深入而逐渐成长。也请大家多多指教!
Reference
yaml 1.2 官网
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。