SpringBoot配置之YAML文件详解

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代表换行,输出:

image-20220428162934766

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
        - 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配置之YAML文件详解_第1张图片

SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。

  • application.properties
  • application.yml

其中,application.yml 与 application.properties 一样,可以在 Spring Boot 启动时被自动读取,修改 Spring Boot 自动配置的默认值。

你可能感兴趣的:(spring,SpringBoot,YAML,SpringBoot,spring)