• yml语法学习

    配置文件

    springboot使用一个全局的配置文件,配置文件名称是固定的。

  • application.properties

    • 语法结构为 key=value
  • applicaition.yml

    • 语法结构为 key: 空格 value
    • yml对空格要求十分严格

      配置文件的作用

  • 修改springboot自动配置的默认值,因为springboot在底层进行了相当多的自动配置。

  • 比如可以在配置文件中修改tomcat启动的默认端口号

`server.port=8081

yaml概述

  • yaml 是”YAML Ain’t a Markup Language” yaml不是一种标记语言的跌贵缩写,在开发的这种语言时,yaml的意思其实是 Yet Another Markup Language”(仍是一种标记语言)

    这种语言以数据操作为中心,而不是以标记语言为重点

  • 以前的配置文件,大多数都是xml来进行配置,比如一个简单的端口配置,对比一下yml和xml的区别

    1. <server>
    2. <port>8081<port>
    3. </server>

    yaml配置

    server:
    prot: 8080
    

    yaml基础语法

  • 语法要求严格

    • 空格不能省略
    • 以缩进来控制层级关系,只要是左边对其的一列数据就都是同一个层级的
    • 属性和值的大小写都十分敏感

      字面量: 普通的值【数字,布尔值,字符串】

  • 字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号

`k: v

  • 注意

    • “” 双引号, 不会转移字符串里面的特殊自负,特殊字符回作为本身想表示的意思
      • 比如 name: “addicated \n is bing” 输出: addicated 换行 bing
    • ‘’单引号,会转译特殊字符,特殊字符最终会编程和普通字符一样输出
      • 比如 :name: ‘kuang \n shen’ 输出 :kuang \n shen

        对象,map 键值对

        #对象、Map格式
        k: 
        v1:
        v2:
        
  • 下面来一行写对象的属性与值的关系

    student:
      name: addicated
      age: 3
    
  • 行内写法

`student: {name: addicated,age: 3}

数组(list,set)

  • 用 - 值表示数组中的一个元素,比如

    pets:
    - cat
    - dog
    - pig
    
  • 行内写法

`pets: [cat,dog,pig]

例子:修改springboot默认端口

server:
    port: 8082

yaml文件更强大的地方在于,可以直接给实体类进直接注入匹配值。通过这个特性,可以实现yaml注册配置信息到javaconfig类来统筹配置信息。

yaml注入配置文件

  • 在springboot项目中的resources目录下面新建一个application.yml文件
  • 编写一个实体类Dog ```java package com.kuang.springboot.pojo;

@Component //注册bean到容器中 public class Dog { private String name; private Integer age;

//有参无参构造、get、set方法、toString()方法  

}


- 思考,原来是如何给bean注入属性值的,使用value注解直接在属性上注明
```java
@Component //注册bean
public class Dog {
    @Value("阿黄")
    private String name;
    @Value("18")
    private Integer age;
}
  • 在springboot的测试类进行输出 ```java @SpringBootTest class DemoApplicationTests {
@Autowired //将狗狗自动注入进来
Dog dog;


@Test
public void contextLoads() {
    System.out.println(dog); //打印看下狗狗对象
}

}


- 编写一个复杂的实体类来进行测试 person类
```java
@Component //注册bean到容器中
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    //有参无参构造、get、set方法、toString()方法  
    // 或者直接使用 lombok注解
}
  • 使用yaml哦诶值方式进行注入,编写一个yml配置

    person:
    name: addicated
    age: 3
    happy: false
    birth: 2000/01/01
    maps: {k1: v1,k2: v2}
    lists:
     - code
     - girl
     - music
    dog:
      name: 旺财
      age: 1
    
  • 之后进行注入

    /*
    @ConfigurationProperties作用:
    将配置文件中配置的每一个属性的值,映射到这个组件中;
    告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
    参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
    */
    @Component //注册bean
    // 这里如果爆红的话是 因为springboot的注解处理器没有找到,顺着提示会找到一个依赖
    @ConfigurationProperties(prefix = "person")
    public class Person {
      private String name;
      private Integer age;
      private Boolean happy;
      private Date birth;
      private Map<String,Object> maps;
      private List<Object> lists;
      private Dog dog;
    }
    

    image.png

  • 导入即可

    <!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
    </dependency>
    
  • 以上都确认没有问题之后,进行测试

  • 注意

    • 如果配置文件的key值和属性的值设置不一样,则结果输出为null,注入失败

      加载指定的配置文件

      @PropertySource注解:加载指定的配置文件
      @ConfigurationProperties注解 : 默认从全局配置文件中获取值 ```java // 方式2 // 加载指定的配置文件 // javaConfig 绑定配置文件的值可以采取上面这些方式。 @PropertySource(value=”classpath:addicated.properties”) // 会在根目录下去寻找对应的properties @Validated // 数据校验 public class Person {

      // SPEL 表达式取出配置文件中的配置 // @Value(“${name}”)

// JSR303 提供的验证注解,message可指定验证错误时返回的文本

// @Email(message=”邮箱格式错误”) private String name; private Integer age; private boolean happy; private Date birth; private Map maps; private List list; private Dog dog;

<a name="nL2dH"></a>
# 配置文件占位符

- 配置文件还可以编写占位符生成随机数
```java
person:
    name: addicated${random.uuid} # 随机uuid
    age: ${random.int}  # 随机int
    happy: false
    birth: 2000/01/01
    maps: {k1: v1,k2: v2}
    lists:
      - code
      - girl
      - music
    dog:
      name: ${person.hello:other}_旺财
      age: 1

回顾properties配置

  • yaml方式是最简单的方式,同时也是springboot所推荐的。
  • properties配置文件在写中文的时候有的时候会出现乱码,需要去idea中设置编码格式为UTF-8
  • 路径为 preference->fileencoding
  • image.png

    对比小结

  • @Value这个使用起来不够友好,需要为每个属性进行单独注解赋值,比较麻烦

  • image.png
  • configurationProperties只需要写一次就可,@Value则需要每个字段都添加
  • 松散绑定:比如yml中写的last-name lastname也会被匹配到,
  • JSR303数据校验,可以针对pojo类增加一层过滤器验证,具体使用方法需要看源码,同时在pom中引入相关依赖
  • 复杂类型封装,yml中可以封装对象,但是value就不支持

    结论

  • 配置yml和配置properties都可以获取到值的情况,强推yml

  • 如果在某个业务中,只需要获取到配置文件中的某个值,那么使用一个value注解也无妨。