• 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配置

    1. server
    2. prot: 8080

    yaml基础语法

  • 语法要求严格

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

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

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

`k: v

  • 注意

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

        对象,map 键值对

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

    1. student:
    2. name: addicated
    3. age: 3
  • 行内写法

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

数组(list,set)

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

    1. pets:
    2. - cat
    3. - dog
    4. - pig
  • 行内写法

`pets: [cat,dog,pig]

例子:修改springboot默认端口

  1. server:
  2. 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;

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

}

  1. - 思考,原来是如何给bean注入属性值的,使用value注解直接在属性上注明
  2. ```java
  3. @Component //注册bean
  4. public class Dog {
  5. @Value("阿黄")
  6. private String name;
  7. @Value("18")
  8. private Integer age;
  9. }
  • 在springboot的测试类进行输出 ```java @SpringBootTest class DemoApplicationTests {
  1. @Autowired //将狗狗自动注入进来
  2. Dog dog;
  3. @Test
  4. public void contextLoads() {
  5. System.out.println(dog); //打印看下狗狗对象
  6. }

}

  1. - 编写一个复杂的实体类来进行测试 person
  2. ```java
  3. @Component //注册bean到容器中
  4. public class Person {
  5. private String name;
  6. private Integer age;
  7. private Boolean happy;
  8. private Date birth;
  9. private Map<String,Object> maps;
  10. private List<Object> lists;
  11. private Dog dog;
  12. //有参无参构造、get、set方法、toString()方法
  13. // 或者直接使用 lombok注解
  14. }
  • 使用yaml哦诶值方式进行注入,编写一个yml配置

    1. person:
    2. name: addicated
    3. age: 3
    4. happy: false
    5. birth: 2000/01/01
    6. maps: {k1: v1,k2: v2}
    7. lists:
    8. - code
    9. - girl
    10. - music
    11. dog:
    12. name: 旺财
    13. age: 1
  • 之后进行注入

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

    image.png

  • 导入即可

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

  • 注意

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

      加载指定的配置文件

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

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

  1. // 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;

  1. <a name="nL2dH"></a>
  2. # 配置文件占位符
  3. - 配置文件还可以编写占位符生成随机数
  4. ```java
  5. person:
  6. name: addicated${random.uuid} # 随机uuid
  7. age: ${random.int} # 随机int
  8. happy: false
  9. birth: 2000/01/01
  10. maps: {k1: v1,k2: v2}
  11. lists:
  12. - code
  13. - girl
  14. - music
  15. dog:
  16. name: ${person.hello:other}_旺财
  17. 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注解也无妨。