1 yaml 介绍
百度百科:YAML 是 “YAML Ain't a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),是为了强调这种语言以数据作为中心,而不是以标记语言为中心,而用反向缩略语重命名
解读如下
- YAML 以数据为中心,而不是以标记语言为重点
- YAML 仍然是一种标记语言,但是和传统的标记语言不一样,是以数据为中心的标记语言
- YAML 非常适合用来做以数据为中心的配置文件(springboot:application.yml)
2 使用文档
官方文档(英文): The Official YAML Web Site
java操作yaml文档(中文):java操作yaml文件 - strongmore - 博客园 (cnblogs.com)
3 yaml基本语法
- 形式为 key: value(:号后面有空格)
- 区分大小写
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。(有些地方也识别tab,推荐使用空格)
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- #表示注释,从这个字符一直到行尾,都会被解析器忽略
- 字符串默认不用加引号,包含空格或特殊字符必须加引号,单引号或双引号都可以
4 数据类型
4.1 字面量
字面量:单个的,不可再分的值。字符串、布尔值、整数、浮点数、Null、时间
举例:
字符串
userId: S123
username: "lisi"
password: '123456'
province: 山东
city: "济南 : ss"
布尔值
success: true
整数
age: 13
浮点数
weight: 75.5
Null
gender: ~
时间 (时间使用ISO8601标准 ISO8601)
createDate: 2001-12-14T21:59:43.10+05
4.2 对象
对象:键值对的集合
行内写法:
k: {k1: v1,k2: v2,k3: v3}
多行写法:
k: k1: v1k2: v2k3: v3
举例:
写在一行
address: {province: 山东, city: 济南}
写在多行
address:province: 山东city: 济南
4.3 数值
数值:一组按次序排列的值
行内写法:
k: [v1,v2,v3]
多行写法
k: - v1- v2- v3
举例:
写在一行
hobbyList: [游泳, 跑步]
写在多行
hobbyList:- 游泳- 跑步
5 yaml应用实例
需求说明:使用yaml配置文件 和 JavaBean 进行数据绑定,体会yaml使用方式
(1)创建一个新的SpringBoot项目-configuration
(2)在 pom.xml 文件中加入以下依赖
<!-- 导入 springboot 父工程,规定的写法 -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version>
</parent>
<dependencies><!-- 导入 web 项目场景启动器,会自动导入和 web 开发相关依赖,非常方便 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency>
</dependencies>
(3)在src/main/java目录下创建包 com.springboot.bean,在bean包下创建实体类 Car.java
package com.springboot.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;@NoArgsConstructor
@AllArgsConstructor
@Data
@Component
public class Car {private String name;private Double price;
}
(4)(核心)在包 bean 下创建实体新的实体类 Monster.java
说明:在类上加上注解 @ConfigurationProperties 即可绑定yaml文件中的值,前缀为键值对中的 key
package com.springboot.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.*;@NoArgsConstructor
@AllArgsConstructor
@Data
@Component
// 使用@ConfigurationProperties 即可绑定yaml文件中的值,前缀为键值对中的 key
@ConfigurationProperties(prefix = "monster")
public class Monster {private Integer id;private String name;private Integer age;private Boolean isMarried;private Date birth;private Car car;private String[] skill;private List<String> hobby;private Map<String, String> wife;private Set<Double> salaries;private Map<String, List<Car>> cars;
}
(5)在包 com.springboot 下创建软件包 controller,在controller包下创建 HiController.java
package com.springboot.controller;import com.springboot.bean.Monster;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;// @RestController = @Controller+ @ResponseBody
@RestController
public class HiController {@Resourceprivate Monster monster;@RequestMapping("/monster")public Monster monster(){return monster;}}
(6) (核心)在resources 目录下创建yaml文件 application.yml。文件后缀为 yaml 、yml 均可
monster:id: 100name: 牛魔王age: 500isMarried: truebirth: 2000/11/11car: {name: 宝马, price: 200000}skill:- 芭蕉扇- 牛魔王hobby: [喝酒,吃肉]wife:no1: 玉面狐狸no2: 铁扇公主salaries: [20000,30000]cars:# key不能为中文group1:- {name: 宝马, price: 400000}- {name: 奔驰, price: 300000}group2:- {name: 迈巴赫, price: 300000}- {name: 奥迪, price: 300000}
(7)在包 com.springboot 下创建主程序Application.java
package com.springboot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
(8)启动主程序,在浏览器输入 http://localhost:8080/monster 进行测试,效果如下
测试完成!yaml 文件中的数据成功绑定到bean中
6 yaml使用细节
如果application.properties 和 application.yml 有相同的前缀值绑定,则application.properties优先级高