3

前言

在spring漫长的历史中,配置一直是新手入门的头疼问题。往往只能从网上找到一个demo,再将里面的内容修改为自己的数据。但是一旦出现新的需求,往往不知道如何修改配置。spring经历了从xmlproperties文件再到yml文件乃至利用java代码进行配置,努力将配置文件保持对用户友好。但是在这个可读性增强的过程中其实学习曲线也在一定程度的上升。

所以这篇文章的目的并不是教会你去配置spring项目,而是要教会你如何去读懂spring配置文件

spring的其他配置方式

除去YAML,spring可以通过XML,JAVA和properties文件进行配置。这些配置都将不是本文的重点说明内容。但是在这里要稍微提一下application.properties文件配置项目。application.properties文件应当放于resources文件夹之下。如果不是用maven创建项目的话,只需要将一个文件夹的属性更改为resource即可。

当然,spring也支持多个properties文件。比如想要创建一个validation.properties文件用以记录验证项,那么也只需要将该文件放在resources文件夹之下。示例目录如下:

clipboard.png

application.properties中使用的配置格式如下:

clipboard.png

这里描述了THYMELEAF配置,采用x.y.z=value的格式。我们只需要知道一下形式,无需了解具体的内容是什么。在下一次教程中涉及THYMELEAF时会具体讲解。

从这个截图可以看出,会有相当多的重复的namespace。比如spring.thymeleaf前缀出现了许多次。这些冗余的内容也导致该文档的可读性不是很高。再加上*.properties文件的默认编码为iso,因此如果配置文件中存在中文的话,读出来就是乱码。虽然也有方式改变其编码格式,但是使用yaml配置文件的可以将上述两个问题全部解决。

YAML

YAML全名YAML Ain’t Markup Language。YAML因为其简单的文本格式使其可以运用于各种场景,包括配置文件,网络信息传输和对象持久化等。Spring也正是基于这一点支持其作为自己的配置文件格式。YAML为了实现至简性,减去了很多结构化元素,努力将文本的可读性最大化。与之相比,XMLJSON都显得复杂。更为有趣的一点时,YAML其实是JSON的一个父集,也就是说,所有的标准的JSON文件都可以被YAML解读。

YAML语法速成

yaml将数据分为三种基本类型:

  1. mappings:hashes/dictionaries
  2. sequences:arrays/list
  3. 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 官网

clipboard.png
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~


raledong
2.7k 声望2k 粉丝

心怀远方,负重前行