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
【注意】
- 字符串默認不用加引號;
- " ",雙引號不會轉義字符串中的特殊字符,特殊字符會作為本身表示的意思;例:Spring \n Boot,輸出:Spring 換行 Boot
- ' ' ,單引號會轉義特殊字符,特殊字符會作為普通字符一樣輸出。例:Spring \n Boot,輸出:Spring \n Boot
3.2、配置【Object、Map】數據類型
【語法】
key:
value1: ××
value2: ××
...
【示例】
# 寫法1
object_map_1:
name: 張三
age: 23
# 寫法2
object_map_2: {name: 張三, age: 20}
3.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.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
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
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)
