<>SpringBoot配置之YAML文件详解

<>介绍

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支持以下几种数据结构:

* 字面量(即普通的值,例如number、boolean、date、string等)
* 对象 属性值的集合
* 数组 一组按次序排序的值
* 集合List、Set与数组一样,Map与对象一样键值对的集合
<>字面量

字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及 日期等。

在 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
<>对象(属性和值)、Map(键值对)

在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 文件可以由一个或多个文档组成,文档之间使用“—”作为分隔 符,且个文档相互独立,互不干扰。如果 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 -
marioscore: 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 自动配置的默认值。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信