Spring Boot YAML语法及占位符

一、什么是YAML

YAML是YAML Ain’t markup language的缩写,表明其不是一种标记语言(xml、html是标记语言)。它是一种数据序列化语言,通过一定的格式表示数据结构。由于其良好的数据结构表现能力,既方便程序处理,也方便程序员阅读,所以其常常被用于书写配置文件。

以前使用 XML 来进行配置的时候,如一个端口配置,要写为:

<server>
    <port>8081<port>
</server>

若使用 YAML 来配置,则表示为:

server:
  prot: 8081

可以看出相比 XML,YAML 对于数据的配置更加直观,易于理解。

二、YAML文件基本语法

YAML的语法非常严格!

  • 空格不能省略
  • 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
  • 属性和值的大小写都是十分敏感的。

1、普通字段

name: zhangsan

注意:值不加引号

2、对象、Map

对象、Map的配置方式是一样的。

student:
   name: zhangsan
   age: 3

行内写法:

student: {name: zhangsan,age: 3}

3、数组、List

用 - 值表示数组中的一个元素,比如:

pets:
 - cat
 - dog
 - pig

行内写法:

pets: [cat,dog,pig]

三、设计一个YAML数据结构

首先我们提出这样一个需求:

#    1. 有一个人名字(name)叫"Tom",年龄(age)为18岁
#    2. Tom的兴趣爱好(hobby)比较广泛,会打篮球(basketball),足球(football),游泳(swimming)
#    3. Tom有两位好朋友(friends)
#    4. 其中一位好朋友名字(name)叫"Mark",年龄(age)为17岁
#    5. 另一位好朋友名字(name)叫"Louis",年龄(age)为19岁

上面的数据结构用yaml该如何表示呢?

person:
  name: Tom
  age: 18
  hobby:
    - basketball
    - football
    - swimming
  friends:
    - name: Mark
      age: 17
    - name: Louis
      age: 19

或者

person:
  name: Tom
  age: 18
  hobby: [basketball, football, swimming]
  friends:
    - {name: Mark,age: 17}
    - {name: Louis,age: 19}

注意事项1:字符串的单引号与双引号

  • 双引号: 会转义字符串里面的特殊字符,如下面\n被转义为换行:
    ​ name: “zhangsan \n lisi”:输出:zhangsan 换行 lisi

  • 单引号: 不会转义特殊字符,特殊字符最终只是作为一个普通的字符串数据,如:
    ​ name: ‘zhangsan \n lisi’:输出:zhangsan \n lisi

注意事项2:支持松散的语法

在spring Boot应用中YAML数据格式支持松散的绑定语法,也就是下面的三种key都是一样的。

country-name = countryName= country_name

四、YAML配置文件占位符

Spring Boot配置文件支持占位符,一些用法如下:为persopn.age设置一个随机数

person:
    age: ${random.int}

1、随机数占位符

  • ${random.value} : 类似uuid的随机数,没有"-"连接
  • ${random.int} : 随机取整型范围内的一个值
  • ${random.long} : 随机取长整型范围内的一个值
  • ${random.long(100,200)} : 随机生成长整型100-200范围内的一个值
  • ${random.uuid} : 生成一个uuid,有短杠连接
  • ${random.int(10)} : 随机生成一个10以内的数
  • ${random.int(100,200)} : 随机生成一个100-200 范围以内的数

2、默认值

占位符获取之前配置的值,如果没有可以是用“冒号”指定默认值
格式例如,xxxxx.yyyy是属性层级及名称,如果该属性不存在,冒号后面填写默认值

${xxxxx.yyyy:默认值}

比如为配置mother.best属性,如果family.mother.name存在则mother.best=${family.mother.name},family.mother.name这个配置不存在,则取值mother.best=lucy:

mother:
    best: ${family.mother.name:lucy}

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码