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: v1
k2: v2
k3: 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 {
@Resource
private Monster monster;
@RequestMapping("/monster")
public Monster monster(){
return monster;
}
}
(6) (核心)在resources 目录下创建yaml文件 application.yml。文件后缀为 yaml 、yml 均可
monster:
id: 100
name: 牛魔王
age: 500
isMarried: true
birth: 2000/11/11
car: {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优先级高