简介
yaml配置文件和properties配置文件一样都是Spring默认的配置文件,yaml配置文件全称为YAML Ain't Markup Language,以为yaml是(不是)一个标记语言,是不是很神奇?哈哈哈。
yaml是以数据为中心的配置文件,比json、xml等更适合做配置文件。同时它是通过节点进行分级配置。yaml配置文件的文件后缀名可以是yml也可以是yaml。
语法
缩进和写法
server:
port: 8080
name: happy
-
yaml配置文件是以 Key: value 的形式进行书写的,请注意!Key和冒号之间没有空格,而冒号和value之间必须有一个空格。
-
yaml配置文件的同级节点前的空格数量必须相同,相同的空格数表示当前节点是在同一级下,比如上边yaml的port和name是server的子节点,它们前面都有四个空格。
-
ymal配置文件是大小写敏感的。
数据类型
yaml的数据类型有三种:字面量、对象(Map或键值对)和数组。
字面量
字面量即为 key: value 的形式来记录键对应的值。
值得注意的是,字符串默认不需要书写额外的双引号或单引号,双引号和单引号引用的字符串有特殊意义。
双引号:不会转义字符串里的转义字符,即 "zhangsan\tlisi" 打印出来就是 zhangsan\tlisi。
单引号:会转义字符串中的转义字符,即 "zhangsan\nlisi" 打印出来就是"zhangsan
lisi"。
对象、键值对(Map)
节点写法
对象的写法还可以以 key: value 的形式:
User:
username: admin
password: 123456
User对象在yaml文件中写法如上。我们在阅读时将User节点看作一个对象整体,它下边所有的节点均为它的字段。
行内写法
还以User对象为例,行内写法类似json但由不完全相同。
User: {username: admin, password: 123456}
数组
节点写法
数组中每个值前边加上“- ”,即短横线空格,例子如下。
Animal:
- cat
- pig
- dog
行内写法
行内写法将数组每个元素用方括号括住。
Animal: [cat, pig, dog]
占位符
通过el表达式可以取到上文已经定义的值
server:
port: 80
my:
exp: 端口是${spring.port}
从配置文件节点my.exp读出来的值就是:“端口是80”。
在el表达式中通过冒号还可以指定默认值,即${spring.port:8080}
,当它取不到值的时候,可以默认其值是8080。
profile
当需要应用在多个环境有多套不同配置文件时,可以使用spring.profiles
节点帮助我们切换多个配置文件。
新建多个application-${settingName}.yml
文件来为多个环境进行配置。
在application.yml文件中通过spring.profiles.active
来决定启动那个配置文件。
spring:
profiles:
# 启动开发环境的配置文件
active: dev
(本节内容同样适用于properties文件)
文档块
通过---
可以将一个yaml文件分成多份,然后通过spring.profiles
来标识当前文档块是哪一个profile。在第一个文档块中通过spring.profiles.active
来激活想使用的profile。
这有点类似将一个文件分成多个文件。
spring:
profiles:
# 使用开发环境配置
active: dev
---
spring:
profiles: prd
server:
port: 8080
---
spring:
profiles: dev
server:
port: 8070
---
spring:
profiles: test
server:
port: 8071
程序启动参数决定配置文件
在启动应用时通过加上--spring.profiles.active=prd
参数的方式可以决定使用那一份配置文件。
java -jar app.jar --spring.profiles.active=prd
通过命令行方法选择的配置文件优先级要高于文件中配置的方法。
虚拟机参数
可以通过虚拟机参数-Dspring.profiles.active=prd
来指定使用的配置文件。
运行代码为:
java -jar -Dspring.profiles.active=prd app.jar
配置文件加载位置
SpringBoot加载配置文件的位置有四个,优先级从高到底分别为
- file:/config/
- file:/
- classpath:/config/
- classpath:/
即文件路径下的config文件夹优先级最高,类路径根目录下的配置文件优先级最低。SpringBoot会优先加载优先级高的配置文件,然后从高到底顺序加载配置,高优先级配置会覆盖低优先级的配置,形成互补配置。
通过程序启动参数spring.config.location=
可以加载指定位置的配置文件,但原有路径的配置文件依然会被加载,形成互补配置。