yaml文件格式

语法格式

YAML(YAML Ain't Markup Language)是一种数据序列化格式 , 具有容易阅读、容易与脚本语言交互、以数据为核心即重数据轻格式的特点

  • YAML数据常见的文件扩展名有yml格式(主流)和yaml格式两种

YAML文件的语法格式: key: value结构(kv之间有空格且区分大小写),使用#表示注释

  • 使用缩进表示层级关系, 缩进也可以使用tab或空格, 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • 字符串无需加引号,单引号会转义将/n作为字符串输出、双引号不会转义将\n作为换行输出
boolean: TRUE  						#TRUE,true,True,FALSE,false,False均可
float: 3.14    						#6.8523015e+5  #支持科学计数法
int: 123       						#0b1010_0111_0100_1010_1110    #支持二进制、八进制、十六进制
null: ~        						#使用~表示null
string: HelloWorld      			#字符串可以直接书写
string2: "Hello World"  			#可以使用双引号包裹特殊字符
date: 2018-02-17        			#日期必须使用yyyy-MM-dd格式
datetime: 2018-02-17T15:02:31+08:00 #时间和日期之间使用T连接,最后使用+代表时区

在书写字符串时,如果属性值中包含特殊字符如转义字符,此时可以将数据字符串使用双引号包裹起来表示作为字符解析(默认不做处理)

lesson: "Spring\tboot\nlesson"

yaml格式表示数组: 在属性名书写位置的下方使用-作为数据开始符号(要与数据间使用空格分隔),一个-号对应数组的一个元素

  • 基本类型数组/list集合行内格式: 数组/集合名: [元素1,元素2]
  • 对象数组/map集合行内格式: 数组/集合名: [{对象1/键值对1},{对象2/键值对2}]
  • 对象和键值对的集合(如map): 对象/集合名: {k1: v1,k2: v2}
enterprise:
	name: itcast
    age: 16
    subject:
    	- Java
        - 前端
        - 大数据
#数组书写行内格式
likes: [王者荣耀,刺激战场]		
#对象数组格式一
users:							 
  - name: Tom
   	age: 4
  - name: Jerry
    age: 5
#对象数组格式二
users:							 
  -  
    name: Tom
    age: 4
  -   
    name: Jerry
    age: 5	
#对象数组行内格式
users2: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ]

读取yaml文件数据的三种方式

yaml文件就是专门用来定义数据的, 这些数据大部分是给SpringBoot框架内部使用,当然我们自己也可以配置一些数据自己使用

读取单一数据

属性名引用方式: 先使用${一级属性名.二级属性名……}读取yaml文件中定义的数据,然后使用@Value注解把读取的值注入到Bean的属性上

  • 缺点: 如果yaml文件中定义的数据量过大,需要在Bean中定义很多属性接收数据读取到的数据

Java中获取yaml中的数据 java读取yaml文件_spring boot

读取全部数据

对象封装的方式: 先声明一个Environment对象用来封装yaml文件中的所有数据,然后使用@Autowired注解把yaml文件中的数据注入到Environment对象中

  • 通过Environment的getProperties("一级属性名.二级属性名……")方法从Environment对象中获取yaml文件中对应的数据
  • 缺点: 每次拿数据都要调用Environment对象的getProperties()方法比较繁琐

Java中获取yaml中的数据 java读取yaml文件_java_02

读取对象数据

Bean对象封装的方式: 首先向Spring容器中注册一个Bean用来封装yaml中的一组数据 ,然后使用@ConfigurationProperties注解的prefix属性指定读取yaml文件中的配置属性前缀,该前缀下的所有配置属性会封装到这个Bean对象中,默认按照配置属性名和Bean对象的属性名的映射关系进行封装

Java中获取yaml中的数据 java读取yaml文件_Java中获取yaml中的数据_03

需求: 封装yaml配置文件中datasource配置项的相关属性

datasource:
 driver-class-name: com.mysql.cj.jdbc.Driver
 url: jdbc:mysql://localhost:3306/ssm db?serverTimezone=UTC
 username: root
 password: root
@Component
// 封装yaml文件中配置项前缀为datasource下的相关数据
@ConfigurationProperties(prefix ="datasource")
public class DataSource {
	private String driverClassName;
	private String url;
	private String userName;
	private String password;
}

需求: 封装yml配置文件中mycar配置项的相关属性

mycar: 
    person:
      #person.userName=zhangsan
      userName: zhangsan
      boss: false
      birth: 2019/12/12 20:12:33
      age: 18
      #person.pet.name=tomcat
      pet: 
        name: tomcat
        weight: 23.4
      interests: [篮球,游泳]
      # List集合
      animal: 
        - jerry
        - mario
      # Map集合
      score: {english: 128,math: 136}    
      # set集合
      salarys: [3999,4999.98,5999.99]
      # Map集合
      allPets:
        sick:
          - {name: tom}
          - name: jerry
            weight: 47}
        health: [{name: mario,weight: 47}]
@ConfigurationProperties(prefix = "mycar")
@Component//普通组件
@Data
public class Person {
    private String userName;
    private Boolean boss;
    private Date birth;
    private Integer age;
    private Pet pet;
    private String[] interests;
    private List<String> animal;
    private Map<String, Object> score;
    private Set<Double> salarys;
    private Map<String, List<Pet>> allPets;
}

@Data
public class Pet {
    private String name;
    private Double weight;
}

yaml文件中的数据引用

当你在编写yaml数据时, 如果发现很多个配置项都具有相同的目录前缀 ,此时你可以先在yaml文件中定义一个配置属性并指定数据,然后使用${属性名}方式引用配置属性的值

center:
 dataDir: D:/usr/local/fire/data
 tmpDir: D:/usr/local/fire/tmp
 logDir: D:/usr/local/fire/log
 msgDir: D:/usr/local/fire/msgDir

#使用${属性名}方式引用属性值
baseDir: /usr/local/fire
center:
    dataDir: ${baseDir}/data
    tmpDir: ${baseDir}/tmp
    logDir: ${baseDir}/log
    msgDir: ${baseDir}/msgDir