2. yaml配置注入
2.1 配置文件
SpringBoot使用一個全局的配置文件 , 配置文件名稱是固定的
-
application.properties
-
- 語法結構 :key=value
-
application.yml
-
- 語法結構 :key:空格 value
- 注意:yaml配置時在”:“號的后面必須嚴格空一個空格
配置文件的作用 :修改SpringBoot自動配置的默認值,因為SpringBoot在底層都給我們自動配置好了;
比如我們可以在配置文件中修改Tomcat 默認啟動的端口號(8080)
server.port=8081
2.2 yaml概述和語法
1.概述
YAML是 "YAML Ain't a Markup Language" (YAML不是一種標記語言)的遞歸縮寫。在開發的這種語言時,YAML 的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)
這種語言以數據作為中心,而不是以標記語言為重點!
以前的配置文件,大多數都是使用xml來配置
傳統xml配置:
<server>
<port>8081<port>
</server>
yaml配置:
server:
prot: 8080
2.基礎語法
說明:語法要求嚴格!
1、空格不能省略
2、以縮進來控制層級關系,只要是左邊對齊的一列數據都是同一個層級的。
3、屬性和值的大小寫都是十分敏感的。
字面量:普通的值 [ 數字,布爾值,字符串 ]
字面量直接寫在后面就可以 , 字符串默認不用加上雙引號或者單引號;
k: v
注意:
-
“ ” 雙引號,不會轉義字符串里面的特殊字符 , 特殊字符會作為本身想表示的意思輸出
如 :name: "kuang \n shen" 輸出 :kuang 換行 shen
-
'' 單引號,會轉義特殊字符 , 特殊字符最終會變成和普通字符一樣輸出
比如 :name: ‘kuang \n shen’ 輸出 :kuang \n shen
對象、Map(鍵值對)
#對象、Map格式
k:
v1:
v2:
在下一行來寫對象的屬性和值得關系,注意縮進;比如:
student:
name: qinjiang
age: 3
行內寫法
student: {name: qinjiang,age: 3}
數組( List、set )
用 - 值表示數組中的一個元素,比如:
pets:
- cat
- dog
- pig
行內寫法
pets: [cat,dog,pig]
修改SpringBoot的默認端口號
配置文件中添加,端口號的參數,就可以切換端口;
server:
port: 8081
2.3 yaml注入配置文件
1、在springboot項目中的resources目錄下新建一個文件 application.yaml
2、編寫兩個實體類進行測試
@Component //注冊bean到容器中
public class Dog {
private String firstname;
private Integer age;
// 有參無參構造、get、set方法、toString()方法
}
@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()方法
}
3、使用yaml配置的方式進行注入,在先前創建好的application.yaml文件中進行配置!
Person:
name: aadzj@qq.com
age: 18
happy: true
birth: 2021/09/22
maps: {k1: v1,k2: v2}
hello: hi
lists:
-code
-music
-girl
dog:
name: 旺財
age: 3
dog:
first-name: 小黃
age: 5
4、把在application.yaml文件中配置好的數據注入到實體類中
如何實現注入呢?在先前的實體類中添加如下注解:@ConfigurationProperties(prefix = "xxx")
/*
@ConfigurationProperties作用:
將配置文件中配置的每一個屬性的值,映射到這個組件中;
告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定
參數 prefix = “person” : 將配置文件中的person下面的所有屬性一一對應
*/
@Component //注冊bean到容器中
@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;
// 有參無參構造、get、set方法、toString()方法
}
5、此時 IDEA 提示,springboot配置注解處理器沒有找到,讓我們看文檔,我們可以查看文檔,找到一個依賴!
6、在pom.xml文件中添加配置文件處理器依賴:spring-boot-configuration-processor
<!-- 導入配置文件處理器,配置文件進行綁定就會有提示,需要重啟 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
這樣下來就把application.yaml文件中的數據注入到實體類中了
如果配置文件的key值和實體類屬性的名設置的不一樣,則結果輸出為null,該屬性值注入失敗
2.4 加載指定的配置文件
@PropertySource :加載指定的配置文件;
@configurationProperties:默認從全局配置文件中獲取值;
1、我們去在resources目錄下新建一個person.properties文件
name=kuangshen
2、然后在我們的代碼中指定加載person.properties文件
@PropertySource(value = "classpath:person.properties")
@Component //注冊bean
public class Person {
private String name;
private Integer age;
private Boolean happy;
......
}
2.5 配置文件占位符
person:
name: aadzj@qq.com${random.uuid} # 隨機uuid
age: ${random.int} # 隨機int
happy: true
birht: 2021/09/22
maps: {k1: v1,k2: v2}
hello: hi
lists:
-code
-music
-girl
dog:
name: ${Person.hello:hello}_旺財 #使用占位符方式
age: 3
dog:
first-name: 小黃
age: 5
2.6 結論
【注意】properties配置文件在寫中文的時候,會有亂碼 , 我們需要去IDEA中設置編碼格式為UTF-8;
settings-->File Encodings 中配置
配置yml和配置properties都可以獲取到值 , 強烈推薦 yaml
如果我們在某個業務中,只需要獲取配置文件中的某個值,可以使用一下 @value;
如果說,我們專門編寫了一個JavaBean來和配置文件進行一一映射,就直接@configurationProperties,不要猶豫!