一、概述
与properties文件,json格式三者都是配置属性文件;yaml 语言可以编写 .yml 文件,相比之下,YAML 是专门用来写配置属性文件的语言,非常简洁和强大,远比 JSON 格式方便。
二、yml配置文件
2.1 yml分析
——一种基于Unicode容易阅读,容易和脚本语言交互的,用来表达资料序列的编程语言。
——适应场景 脚本语言:由于实现简单,解析成本很低,YAML 特别适合在脚本语言中使用
—— 序列化: YAML是由宿主语言数据类型直转,的比较适合做序列化。
—— 配置文件:写 YAML 要比写 XML 快得多(无需关注标签或引号),并且比 INI 文档功能更强。由于兼容性问题,不同语言间的数据流转建议不要用 YAML。
——语言优点 YAML易于人们阅读。 YAML数据在编程语言之间是可移植的。 YAML匹配敏捷语言的本机数据结构。 YAML具有一致的模型来支持通用工具。 YAML支持单程处理。 YAML具有表现力和可扩展性。
2.2 YAML 语法
——使用空格 Space 缩进表示分层,不同层次之间的缩进可以使用不同的空格数目,但是同层元素一定左对齐,即前面空格数目相同(不能使用 Tab,各个系统 Tab对应的 Space 数目可能不同,导致层次混乱)
——‘#’表示注释,只能单行注释,从#开始处到行尾
——破折号后面跟一个空格(a dash and space)表示列表
——用冒号和空格表示键值对 key: value
——简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据。用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符
2.3 配置数据
——配置普通数据
语法: key: value
代码演示:
name: zhangsan
说明:value之前有一个空格
—— 配置对象数据
语法:
#方式一
key:
key1: value1
key2: value2
#方式二
key: {key1: value1,key2: value2}
示例代码:
#方式一
person:
name: zhangsan
age: 18
addr: henan
#方式二
person: {name: zhangsan,age: 18,addr: henan}
说明:key1前面的空格个数不限定,在yml语法中,相同缩进代表同一个级别
——配置Map数据
与配置对象方式相同
—— 配置数组(List、Set)数据
语法:
#方式一
key:
- value1
- value2
#方式二
key: [value1,value2]
示例代码:
city:
- beijing
- tianjin
- shanghai
- chongqing
#或者
city: [beijing,tianjin,shanghai,chongqing]
#集合中的元素是对象形式
student:
- name: zhangsan
age: 18
score: 100
- name: lisi
age: 28
score: 88
- name: wangwu
age: 38
score: 90
说明:value1与 - 之间存在一个空格
例子:
#普通数据配置
name: 张三
#对象的配置
person:
name: 张三
age: 18
addr: 北京
#行内对象配置
person: {name: 张三,age: 18,addr: 北京}
#配置数据、集合(普通字符串)
city:
- beijing
- shanghai
- tianjin
city: [beijin,tianjin,shanghai]
#配置数据、集合(对象数据)
student:
- name: 张三
age: 18
addr: beijin
- name: 李四
age: 19
addr: tianjin
student: [{name: zhangsan,age: 19,addr: beijin},{name: lishi,age: 20,addr: beijin}]
#map配置
map:
key1: value1
key2: value2
2.4 获取数据
#方式一:
@Controller
public class quickController {
//从容器中获取对象的的值
@Value("${name}")
private String name;
@Value("${person.addr}")
private String addr;
@RequestMapping("/quick")
@ResponseBody
public String quick(){
//获取配置文件的信息
return "name:"+name+",addr="+addr;
}
}
#方式二(@ConfigurationProperties):
@Controller
@ConfigurationProperties(prefix = "person")
public class quick2Controller {
//从容器中获取对象的的值
private String name;
private String addr;
//这种方式需要提供set,get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@RequestMapping("/quick2")
@ResponseBody
public String quick2(){
//获取配置文件的信息
return "name:"+name+",addr="+addr;
}
}