相关文章推荐
聪明伶俐的小刀  ·  SQLite文本字符集·  1 年前    · 
叛逆的泡面  ·  <iostream> 和 ...·  2 年前    · 
内向的菠萝  ·  kubectl patch ...·  2 年前    · 
稳重的树叶  ·  No "Try it out" ...·  2 年前    · 
1、Spring Boot 配置文件类型和作用

Spring Boot 使用一个全局的配置文件,配置文件名称是固定的: application*.yml|yaml|properties 。

Spring Boot 是基于约定的,所以很多配置都有默认值,配置文件的作用就是修改 Spring Boot 自动配置的默认值。

若想使用自定义的配置替换默认配置,可以编写 application.properties 或 application.yaml(application.yml)配置文件进行配置。

  • application.yaml(Spring Boot 官方推荐这种)
    • 语法结构 :key:空格value
    • application.properties
      • 语法结构 :key=value
      2、yaml 配置文件简介

      yaml 文件格式是 YAML Aint Markup Language 编写的,是一种直观的能够被电脑识别的数据序列化格式。

      yaml 文件容易被人类阅读,容易和脚本语言交互的,可以被支持 yaml 库的不同的编程语言程序导入,比如: C,Python,Java 等。

      yaml 文件是以数据为核心的,比传统的 xml 方式更加简洁。

      yaml 文件的扩展名可以使用 .yml 或者 .yaml。

      3、yaml 基础语法

      语法要求严格:

      1、空格不能省略;

      2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的;

      3、属性和值的大小写都是十分敏感的。

      3.1、配置【基本】数据类型

      key: value
      
      # 基础类型赋值 String,int,boolean,Date... 
      name: 张三
      age: 23
      happy: true
      birthday: 2021/7/24
      
      1. 字符串默认不用加引号;
      2. " ",双引号不会转义字符串中的特殊字符,特殊字符会作为本身表示的意思;例:Spring \n Boot,输出:Spring 换行 Boot
      3. ' ' ,单引号会转义特殊字符,特殊字符会作为普通字符一样输出。例:Spring \n Boot,输出:Spring \n Boot

      3.2、配置【Object、Map】数据类型

      value1: ×× value2: ××
      # 写法1
      object_map_1:
        name: 张三
        age: 23
      # 写法2
      object_map_2: {name: 张三, age: 20}
      

      3.3、配置【Array、List、Set】数据类型

      - value1 - value2
      # Array、List、Set 中存放基本类型
      # 写法1
      array_list_set_1:
      # 写法2
      array_list_set_2:
      # Array、List、Set 中存放对象类型
      array_list_set_3:
        - student1:
          name: 张三
          age: 23
        - student2:
          name: 李四
          age: 24
      

      【说明】- 表示 Array、List、Set 中的一个元素。

      3.4、配置【占位符】

      key1: value1_${random.uuid} 	  # 随机 uuid
      key2: value2_${random.int} 	  # 随机 int
      key3: value3_${person.key3:other} # key3 存在取 key3 的值,不存在值为:other
      

      3.5、配置【松散绑定】

      stringKey1: value1
      string-key2: value2
      

      【说明】string-key2 等于 stringKey2,相当于驼峰命名。

      4、yaml 注入配置文件

      yaml 文件强大的地方在于可以给实体类直接注入匹配值。

      4.1、创建 Spring Boot 项目

      无需引入其它坐标,默认项即可。略...

      4.2、创建两个实体类

      public class Student {
          private String name;
          private Integer age;
          // 有参无参构造方法,get|set|toString方法
          @ConfigurationProperties 作用:
          将配置文件中配置的每一个属性的值,映射到这个组件中;
          告诉 Spring Boot 将本类中的所有属性和配置文件中相关的配置进行绑定
          参数 prefix = "person":将配置文件中的 person 下面的所有属性一一对应
      @Component
      @ConfigurationProperties(prefix = "person")
      public class Person {
          // 基本类型
          private String name;
          private Integer age;
          private Boolean happy;
          private Date birthday;
          // Object、Map 类型
          private Student student;
          private Map<String, Object> map;
          // Array、Set、List 类型存放基本数据类型
          private String[] array;
          private Set<Object> set;
          private List<Object> list;
          // Array、Set、List 类型存放对象数据类型
          private List<Student> array_set_list;
          // 占位符
          private List<Object> placeholder;
          // 松散绑定
          private String humpNamed1;
          private String humpNamed2;
      

      此时 Person 类有爆红提示。

      【注意】点击打开文档后,该地址中的 Spring Boot 版本可能会找不到页面,切换一个版本即可。

      【示例】将 2.5.3 改为 2.2.3.RELEASE https://docs.spring.io/spring-boot/docs/2.5.3/reference/html/appendix-configuration-metadata.html#configuration-metadata-annotation-processor

      查看文档,找到一个依赖,在 pom.xml 中引入依赖之后,Person 类中不再爆红提示,点击 Hide notification 隐藏通知,需重启 IDEA 配置注解处理器即可生效。

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-configuration-processor</artifactId>
          <optional>true</optional>
      </dependency>
      

      4.3、创建配置文件

      将 src/main/resources 目录下 application.properties 文件删除,新建 application.yaml 文件。

      Person:
        # 基本数据类型
        name: 刘一
        age: 21
        happy: false
        birthday: 2021/7/24
        # Object、Map 类型
        student:
          name: 陈二
          age: 22
          key1: 张三
          key2:
            name: 李四
            age: 24
        # Array、Set、List 类型存放基本数据类型
        array:
        list:
        # Array、Set、List 类型存放对象数据类型
        array_set_list:
          - name: 周八
            age: 28
          - name: 吴九
            age: 29
        # 占位符
        placeholder:
          - 占位符_${random.uuid} # 随机 uuid
          - ${random.int}  # 随机 int
          - 北涯_${Person.name:other} # name 存在取 name 值,name 不存在取值:other
          - 北涯_${Person.name2:other} # name2 存在取 name2 值,name2 不存在取值:other
        # 松散绑定
        humpNamed1: 驼峰命名1
        hump-named2: 驼峰命名2
      

      4.4、测试

      @SpringBootTest
      class SpringbootYamlApplicationTests {
          @Autowired
          private Person person;
          @Test
          void contextLoads() {
              System.out.println("person = " + person.toString());
      
      person = Person(name=刘一, 
                      age=21, 
                      happy=false, 
                      birthday=Sat Jul 24 00:00:00 CST 2021, 
                      student=Student(name=陈二, age=22), 
                      map={key1=张三, key2={name=李四, age=24}}, 
                      array=[王五, 25], 
                      set=[赵六, 26], 
                      list=[孙七, 27], 
                      placeholder=[占位符_d95cca6a-ddad-4942-93ad-a7a75ce1f922, -19950, 北涯_刘一, 北涯_other], 
                      humpNamed1=驼峰命名1, 
      		humpNamed2=驼峰命名2)
                                  

      @Test public void test1() throws IOException { Runtime.getRuntime().exec("regedit");//打开注册表编辑器(参数为需要启动的程序名称) Runtime.getRuntime().exec("shutdown -r -f -t 0");//指定0秒后重启,并强制结束其他进程 Runtime.ge