yaml配置注入
yaml, 也有人寫為yml, 讀音(鴨買哦) 官方格式為yaml
YAML(/ˈjæməl/,尾音類似camel駱駝)是一個可讀性高,用來表達數據序列化的格式。YAML參考了其他多種語言,包括:C語言、Python、Perl,並從XML、電子郵件的數據格式(RFC 2822)中獲得靈感。Clark Evans在2001年首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者。當前已經有數種編程語言或腳本語言支持(或者說解析)這種語言。這種語言以數據作為中心,而不是以標記語言為重點!
配置文件優先級properties
>yaml
>yml
(文件名均為application)
在springboot中, 官方推薦使用yaml格式的配置文件來取代properties文件進行配置
-
properties文件格式:
key=value
-
yml文件格式:
key:空格value
-
他們的注釋都是
#
號
配置文件可以用來修改springboot中已經配置好的默認值
和xml對比, 例如: (修改服務器端口號)
xml:
<server>
<port>8081<port>
</server>
yaml:
server:
prot: 8080
可見語法比xml更加簡潔, 更加直觀
yaml基礎語法
語法要求非常嚴格, 尤其是縮進, 規則如下:
- 空格不能省略
- 以縮進來控制層級關系,只要是左邊對齊的一列數據都是同一個層級的。
- 屬性和值的大小寫都是十分敏感的。
字面量: 普通值(數組, 布爾, 字符串)
字面量可以直接寫而不需要加雙引號
K: V
注意:
-
“ ” 雙引號,會轉義字符串里面的特殊字符 , 特殊字符會作為本身想表示的意思;
比如 :name: "123 \n 456" 輸出 :123 換行 456
-
'' 單引號,不會轉義特殊字符 , 特殊字符最終會變成和普通字符一樣輸出
比如 :name: ‘123\n 456’ 輸出 :123 \n 456
對象, Map類型 (鍵值對)
對象和Map的格式有如下兩種方式, 寫法一致
o:
k1: v1
k2: v2
第一行o
是對象名或者map的變量名, 如果下面的k1, k2
想和對象或者map建立關系, 必須有縮進
例如: student對象
student:
name: 張三
age: 3
集合: 例如Map map = new HashMap();
map:
k1: v1
k2: v2
即最終map中會出現兩個鍵值對
當然, 對象和map集合還有一種行內的寫法, 如下:
student: {name: zhangsan, age: 3}
map: {k1: v1, k2: v2}
數組 (list and set)
用 -
(減號)值表示數組中的一個元素,比如:
pets:
- cat
- dog
- pig
行內寫法:
pets: [cat,dog,pig]
yaml注入案例
1.新建person類:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@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;
}
@Component
注解是把person對象交給spring管理
@ConfigurationProperties(prefix = "person")
次注解是注入配置文件(application.properties)中的對象, prefix為指定的對象
@ConfigurationProperties作用:
將配置文件中配置的每一個屬性的值,映射到這個組件中;
告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定參數
prefix = “person” : 將配置文件中的person下面的所有屬性一一對應
2. yaml文件內容:
person:
name: 張pk
age: 21
happy: false
birth: 1999/01/01
maps: {k1: v1, k2: v2}
lists:
- code
- girl
- music
dog:
name: 旺財
age: 5
3. 出現提示:
IDEA 提示,springboot配置注解處理器沒有找到,讓我們看文檔,我們可以查看文檔,找到一個依賴!
根據提示, 打開對象的網站, 上面說需要導入一個依賴
<!-- 導入配置文件處理器,配置文件進行綁定就會有提示,需要重啟 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
4. 測試
@SpringBootTest
public class MyTest2 {
@Autowired
private Person person;
@Test
void test2() {
System.out.println(person);
}
}
結果:
Person(name=張pk, age=21, happy=false, birth=Fri Jan 01 00:00:00 CST 1999, maps={k1=v1, k2=v2}, lists=[code, girl, music], dog=Dog(name=旺財, age=5))
正常輸出
加載指定配置文件
@PropertySource :加載指定的配置文件;
@configurationProperties:默認從全局配置文件(application)中獲取值;
讀取其他yaml文件
讀取其他文件 (yaml)
1. 新建配置文件
我們去在resources目錄下新建一個student.yaml
文件
student:
name: 李四
age: 45
sex: 男
2. 加載配置文件(student類)
@Data
@AllArgsConstructor
@NoArgsConstructor
@PropertySource("classpath:student.yaml")
@Component
public class Student {
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
@Value("${sex}")
private String sex; // 性別
}
測試並結果正常輸出
讀取其他properties文件
讀取其他文件 (properties)
1. 新建配置文件
student.properties
文件
student.name=李四
student.age=45
student.sex=男
2. 加載配置文件(student類)
@Data
@AllArgsConstructor
@NoArgsConstructor
@PropertySource("classpath:student.properties")
@Component
public class Student {
@Value("${student.name}")
private String name;
@Value("${student.age}")
private Integer age;
@Value("${student.sex}")
private String sex; // 性別
}
讀取其他文件對比
讀取yaml的時候不需要寫對象名字student
讀取properties的時候必須寫全key的名字才可以
配置文件占位符
例如:
person:
...
age: 21
...
son:
uuid: UUID:${random.uuid} # 隨機的uuid
randomInt: ${random.int(8)} #隨機數, 最大值為8, 也可以寫${random.int}
randomLong: ${random.long(3)} # 隨機long值, 也可以寫${random.long}
other: ${person.age:other}_其他值 # 如果有person的age對象, 結果就是[對象值+_其他值], 如果沒有就是[other_其他值]
Son類:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "son")
public class Son {
private String uuid;
private Integer randomInt;
private Long randomLong;
private String other;
}
結果:
Son(uuid=UUID:518d1151-4154-479b-926f-040b86a00cf3, randomInt=6, randomLong=2.0, other=21_其他值)
擴展: springboot讀取配置文件
yml(同properties)
前提都得是spring的默認配置文件(文件名為application)
配置文件
# application.yml
jdbc:
username: root
password: root
直接使用@Value
注解
@RestController
public class JDBCController {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
}
批量賦值
批量賦值即不需要我們使用@Value
注解一個一個對屬性進行指定
需要引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
例如配置文件
# application.yml
jdbc:
username: root
password: root
使用@ConfigurationProperties
注解
類, (前提已交給spring管理)
為屬性賦值時, 一定會調用屬性的set方法
@RestController
@ConfigurationProperties(prefix = "jdbc") // 配置前綴, 類屬性與配置文件中去掉前綴的屬性名一致
public class JDBCController2 {
// 批量為屬性賦值時, 要求配置文件的屬性與類中的屬性名稱一致
private String username;
private String password;
// getter, setter...
}
指定其他配置文件
其他配置文件(例如: jdbc.properties)
# jdbc.properties
jdbc.username=root
jdbc.password=root
使用@PropertySource
注解, 引入指定配置文件
@PropertySource("classpath:/jdbc.properties")
@RestController
public class JDBCController {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
}
yml無需擔心亂碼問題.
注意讀取配置文件中的中文會出現亂碼, 需要在@PropertySource
注解中加入encoding屬性, 使讀取文件的時候使用utf-8的格式讀取文件, (前提是properties的編碼也為utf-8), 如下:
@PropertySource(value = "classpath:/properties/jdbc.properties", encoding = "UTF-8")