Spring Boot yaml 配置文件解析

一、Spring Boot 配置文件類型和做用

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

Spring Boot 是基於約定的,因此不少配置都有默認值,配置文件的做用就是修改 Spring Boot 自動配置的默認值。java

若想使用自定義的配置替換默認配置,能夠編寫 application.properties 或 application.yml(application.yaml)配置文件進行配置。spring

  • application.yml(Spring Boot 官方推薦這種
    • 語法結構 :key:空格value
  • application.properties
    • 語法結構 :key=value

二、yaml 配置文件簡介

yaml 文件格式是 YAML Aint Markup Language 編寫的,是一種直觀的可以被電腦識別的數據序列化格式。編程

yaml 文件容易被人類閱讀,容易和腳本語言交互的,能夠被支持 yaml 庫的不一樣的編程語言程序導入,好比: C,Python,Java 等。bash

yaml 文件是以數據爲核心的,比傳統的 xml 方式更加簡潔。app

yaml 文件的擴展名可使用 .yml 或者 .yaml。dom

三、yaml 基礎語法

語法要求嚴格:編程語言

一、空格不能省略;ide

二、以縮進來控制層級關係,只要是左邊對齊的一列數據都是同一個層級的;spring-boot

三、屬性和值的大小寫都是十分敏感的。

3.一、配置【基本】數據類型

【語法】

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.二、配置【Object、Map】數據類型

【語法】

key:
  value1: ××
  value2: ××
  ...

【示例】

# 寫法1
object_map_1:
  name: 張三
  age: 23

# 寫法2
object_map_2: {name: 張三, age: 20}

3.三、配置【Array、List、Set】數據類型

【語法】

key:
  - 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.四、配置【佔位符】

【示例】

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

3.五、配置【鬆散綁定】

【語法】

stringKey1: value1
string-key2: value2

【說明】string-key2 等於 stringKey2,至關於駝峯命名

四、yaml 注入配置文件

新建一個 Spring Boot 項目,建立 Student、Person 兩個實體類

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;
}

【注意】點擊打開文檔後,該地址中的 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>

將 src/main/resources 目錄下 application.properties 文件刪除,新建 application.yml 文件

Person:
  # 基本數據類型
  name: 劉一
  age: 21
  happy: false
  birthday: 2021/7/24

  # Object、Map 類型
  student:
    name: 陳二
    age: 22
  map:
    key1: 張三
    key2:
      name: 李四
      age: 24

  # Array、Set、List 類型存放基本數據類型
  array:
    - 王五
    - 25
  set:
    - 趙六
    - 26
  list:
    - 孫七
    - 27

  # 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

【測試】

@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)
相關文章
相關標籤/搜索