YAML
是"YAML Ain’t Markup Language"(YAML不是一种标记语言)的递归缩写。
在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。
因为比xml,语法更加简洁,更轻量级,比.properties文件更具有层次,非常适合用来作为数据中心的配置文件。例如SpringBoot
的配置文件就支持YAML格式的。
这里就以在SpringBoot配置为例,详细介绍YAML文件的基本用法。
首先,想要使用
YAML
作为属性配置文件(以 .yml 或 .yaml 结尾
),需要将SnakeYAML
库添加到 classpath 下,Spring Boot 中的spring-bootstarter-web
或spring-boot-starter
都对 SnakeYAML 库做了集成, 只要 项目中引用了这两个 Starter 中的任何一个,Spring Boot 会自动添加 SnakeYAML 库到 classpath 下。
YAML作为属性配置文件,通常以 .yml
或者 .yaml
为后缀名。
YAML对语法的要求比较严格:
大小写敏感
使用缩进表示层级关系
缩进不允许使用tab
键,必须使用空格缩进
缩进的空格数不重要,但是同级元素必须左侧对齐
‘#’ 表示注释
字符串无需加引号,如果加,单引号对与双引号对都可以
注意:
单引号与双引号都支持转义符,但是单引号不支持 ‘/’ 转义,而双引号支持,例如 '/n’换行
另外还有以下约定:
使用 k: v表示键值对关系,冒号后面必须有一个空格
支持松散表示,java中对于驼峰命名法,可用原名或使用-代替驼峰,如 java中的lastName属性,在yml中使用lastName或 last-name都可正确映射。
YAML支持以下几种数据结构:
字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及 日期等。
在 YAML 中,使用“key:[空格]value”
的形式表示一对键值对(空格不能省略
)
字面量直接写在键值对的“value”
中即可,且默认情况下字符串是不需要使 用单引号或双引号的。
username: root
若字符串使用单引号,则不会转义特殊字符,特殊字符会输出为其本身想表达的含义
name: 'zhangsan \n lisi'
输出: zhangsan \n lisi
若字符串使用双引号,则会转义特殊字符,\n代表换行,输出:
name1: zhangsan
name2: 'zhangsan \n lisi'
name3: "zhangsan \n lisi"
age: 18
flag: true
date: 2022/04/28
在YAML中,对象与Map的表示方式很像。他们都是一对键值对,YAML为对象提供了两种写法。
普通写法,使用缩进表示对象与属性之间的层级关系
person:
name: 张三
age: 18
行内写法
person: {name: 张三,age: 18}
#注意 name: value :后面要有空格
YAML使用 "-"
表示数组(Array)、list、set中的元素
普通写法
course:
- spring
- mybatis
- spring boot
行内写法
course: [spring,mybatis,spring boot]
以上几种数据结构可以任意组合使用,以实现不同的用户需求
soberw:
username: 'abc \n hello' #字符串
password: 6564321 #字符串
birthday: 2011/12/23 #日期
books: #map
jsp: 36
html: 78
spring: 78
books2: {jsp: 56,spring: 65,mybatis: 98} #map 行内
person: #javabean
name: abc
age: 23
person2: {name: lily, age: 36 } #javabean行内
hobby: #数组
- jsp
- hibernate
- spring
- mybatis
list: # list集合
- 32
- 65
- 98
set: #set 集合
- hello
- world
hobby2: [23,45,56] #数组 list set 行内
mapList: # 数组 list set 里存map
- jsp: 36
hibernate: 58
- html: 65
css: 98
js: 65
- {vue: 36,react: 98}
一个 YAML 文件可以由一个或多个文档组成,文档之间使用“—”作为分隔 符,且个文档相互独立,互不干扰。如果 YAML 文件只包含一个文档,则“- --”分隔符可以省略。
以SpringBoot中配置组件为例:
声明两个JavaBean类:
Person
package com.soberw.springboot_study;
import com.soberw.springboot_study.bean.Pets;
import lombok.Data;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author soberw
* @Classname Person
* @Description
* @Date 2022-04-28 17:18
*/
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String username;
private Boolean boss;
private Date birth;
private Integer age;
private Pets pets;
private String[] interests;
private List<String> animal;
private Map<String,Object> score;
private Set<Double> salarys;
private Map<String,List<Pets>> allPets;
}
Pets
package com.soberw.springboot_study.bean;
import lombok.Data;
/**
* @author soberw
* @Classname Pets
* @Description
* @Date 2022-04-28 17:18
*/
@Data
public class Pets {
private String name;
private Double weight;
}
YAML配置:
# yaml表示以上对象
person:
userName: zhangsan
boss: false
birth: 2019/12/12 20:12:33
age: 18
pets:
name: tomcat
weight: 23.4
interests: [篮球,游泳]
animal:
- jerry
- mario
score:
english:
first: 30
second: 40
third: 50
math: [131,140,148]
chinese: {first: 128,second: 136}
salarys: [3999,4999.98,5999.99]
allPets:
sick:
- {name: tom}
- {name: jerry,weight: 47}
health: [{name: mario,weight: 47}]
直接可以在主程序类中获取:
/**
* @author soberw
*/
@SpringBootApplication
public class SpringBootStudyApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringBootStudyApplication.class, args);
Person person = run.getBean(Person.class);
System.out.println("person.getUsername() = " + person.getUsername());
System.out.println("person.getBoss() = " + person.getBoss());
System.out.println("person.getBirth() = " + person.getBirth());
System.out.println("person.getAge() = " + person.getAge());
System.out.println("person.getPets() = " + person.getPets());
System.out.println("person.getInterests() = " + Arrays.toString(person.getInterests()));
System.out.println("person.getAnimal() = " + person.getAnimal());
System.out.println("person.getScore() = " + person.getScore());
System.out.println("person.getSalarys() = " + person.getSalarys());
System.out.println("person.getAllPets() = " + person.getAllPets());
}
}
SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。
- application.properties
- application.yml
其中,application.yml 与 application.properties 一样,可以在 Spring Boot 启动时被自动读取,修改 Spring Boot 自动配置的默认值。