• 05-SpringBoot中yaml文件的语法格式,在程序中读取yaml文件中数据的方式,yaml文件中引用数据的方式


    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连接,最后使用+代表时区
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    lesson: "Spring\tboot\nlesson"
    
    • 1

    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 } ]	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

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

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

    读取单一数据

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

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

    在这里插入图片描述

    读取全部数据

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

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

    在这里插入图片描述

    读取对象数据

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

    在这里插入图片描述

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

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

    需求: 封装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}]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    @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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    jQuery成功之路——jQuery动画效果和遍历效果概述
    vue项目使用lodash节流防抖函数问题与解决
    (仿牛客社区项目)Java开发笔记7.6:热帖排行
    【开发经验】如何快速接入第三方接口
    HarmonyOS-静态库(SDK)的创建和使用
    一个非常不错的开源Docker管理工具-DockerUI
    ZooKeeper TCP连接被防火墙阻断排查过程
    单例的例子
    【解决方案】浅谈基于边缘计算的智慧工地解决方案
    部署keepalived+LVS
  • 原文地址:https://blog.csdn.net/qq_57005976/article/details/134258011