yaml1.yaml介绍

YAML是 “YAML Ain’t a Markup Language” (YAML不是一种标记语言)的递归缩写。在开发这种语言时,YAML的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),是为了强调这种语言以数据为中心,而不是以标记语言为重点,而使用了反向略缩语重命名

  • YAML 以数据为中心,而不是以标记语言为重点
  • YAML 仍然是一种标记语言,但是和传统的标记语言不一样,是以数据为中心的标记语言
  • YAML 非常适合用来做以数据为中心的配置文件,比如SpringBoot中使用application.yaml

官方文档:https://yaml.org/

java操作yaml文件

2.基本语法

  1. 形式为key: value(注意:后有空格)
  2. 区分大小写
  3. 使用缩进表示层级关系
  4. 缩进不允许使用tab,只能使用空格(有些地方识别tab,但推荐使用空格)
  5. 缩进的空格数不重要,只要保证相同层级的元素左对齐即可
  6. 字符串无需加引号
  7. #表示注释该行

3.数据类型3.1字面量

字面量表示单个的,不可再分的值,包括字符串、布尔值、整数、浮点数、Null、日期类型。

  • 字符串 默认不用加引号,如果包含空格或特殊字符必须加引号,单引号或双引号都可以
userId: S123username: "lisi"password: '123456'province: 山东city: "济南 : ss"
  • 布尔值
success: true
  • 整数
age: 13
  • 浮点数
weight: 75.5
  • Null
gender: ~
  • 时间 使用[ISO8601](https://baike.baidu.com/item/ISO 8601/3910715?fr=aladdin)标准
createDate: 2001-12-14T21:59:43.10+05     

3.2对象

对象,键值对的集合,比如map、hash、object

  • 写在一行
k: {k1: v1,k2: v2,k3: v3}
address: {province: 山东, city: 济南}
  • 写在多行
k: k1: v1 k2: v2 k3: v3
address:  province: 山东  city: 济南

3.3数组

数组:一组按照次序排列的值,比如array、list、queue、set

  • 写在一行
k: [v1, v2, v3]
hobbyList: [游泳, 跑步]
  • 写在多行
k: - v1 - v2 - v3
hobbyList:  - 游泳  - 跑步

4.应用实例

  • 使用yaml配置文件,和Javabean进行数据绑定

(1)创建一个新的SpringBoot项目

(2)在pom.xml文件中引入相关的库

    spring-boot-starter-parent    org.springframework.boot    2.5.3            org.springframework.boot        spring-boot-starter-web                org.projectlombok        lombok    

(3)Bean Car.java

注意创建的bean需要在SpringBootApplication包或者其子包,否则不会被扫描,同时也不能完全使用Lombok的相关简化注解

package com.li.bean;import lombok.Data;/** * @author 李 * @version 1.0 */@Datapublic class Car {    private String name;    private Double price;}

(3)Bean Monster.java

package com.li.bean;import lombok.Data;import org.springframework.stereotype.Component;import java.util.Date;import java.util.List;import java.util.Map;import java.util.Set;/** * @author 李 * @version 1.0 */@ConfigurationProperties(prefix = "monster")@Component@Datapublic 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 hobby;    private Map wife;    private Set salaries;    private Map<String, List> cars;}

(4)HiController.java

package com.li.controller;import com.li.bean.Monster;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/** * @author 李 * @version 1.0 */@RestController//@Controller+@ResponseBodypublic class HiController {    @Resource    private Monster monster;    @RequestMapping("/monster")    public Monster monster(){        return monster;    }}

(5)启动类

package com.li;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * @author 李 * @version 1.0 */@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }}

这时启动项目,访问控制器,返回的Monster对象的数据为null

(6)使用yaml给Javabean绑定数据

文件支持yaml或者yml两种后缀,并且在编写application.yaml时,这些bean的字段是可以通过安装插件或者jar来自动提示的

创建resources/application.yaml

monster:  id: 100  name: 牛魔王  age: 899  isMarried: true  birth: 1989/11/23  # 对象# car: {name: 宝马, price: 200000.0}  car:    name: 宾利    price: 300000  #  数组# hobby: [打篮球, 游泳]  hobby:    - 篮球    - 羽毛球  skill: [芭蕉扇, 吐火]  #map-属于对象类型#  wife: {no1: 玉面狐狸,no2: 铁扇公主} #行内风格  wife:    no1: 玉面狐狸    no2: 铁扇公主#  salaries: [10000, 20000] #行内  salaries:    - 10000    - 20000  cars:    group1:     - {name: 宝马, price: 200000}     - name: 保时捷       price: 400000    group2:     - {name: 宾利, price: 300000}

5.yaml使用细节

  1. SpringBoot中,配置文件的三种格式:

    • application.properties

    • application.yml(推荐)

    • application.yaml

    yml 格式和 yaml 格式除了后缀不一样,里面格式完全一样,可以看作是一种格式

  2. 配置文件的加载优先级 properties(最高) > yml > yaml(最低)

  3. 不同配置文件中相同的配置,按优先级高的指定,不同配置文件,如果有不同的配置,则全部保留

  4. 如果yaml文件没有提示,可以引入依赖

        org.springframework.boot    spring-boot-configuratin-processor    true

    或者安装yaml插件