SpringBoot系列之YAML配置用法
1、全域性配置
SpringBoot的全域性配置檔案有兩種:
- application.properties
- application.yml
配置檔案的作用:修改SpringBoot自動配置的預設值,主要是預設值,因為SpringBoot啟動時會自動載入很多預設配置,詳細的可以參考我之前部落格原始碼學習系列之SpringBoot自動配置
2、YAML語言定義
YAML表示YAML Ain’t Markup Language,在百度百科的解釋是:
YAML是"YAML Ain't a Markup Language"(YAML不是一種標記語言)的遞迴縮寫。在開發的這種語言時,YAML 的意思其實是:"Yet Another Markup Language"(仍是一種標記語言),但為了強調這種語言以資料做為中心,而不是以標記語言為重點,而用反向縮略語重新命名。
所以,我們不用在意它是否是一種標記語言,我們只要記得它是一種以資料為中心的語言就可以,語法非常簡潔,使用空白,縮排,分行組織資料,從而使得表示更加簡潔易讀。
3、YAML基本語法
引用部落格http://www.ruanyifeng.com/blog/2016/07/yaml.html
- 大小寫敏感
- 使用縮排表示層級關係
- 縮排時不允許使用Tab鍵,只允許使用空格。
- 縮排的空格數目不重要,只要相同層級的元素左側對齊即可
所以YAML基本語法其實就是key:(空格)value的形式,其中空格必須要有,以空格的縮排來控制層級關係,只要對齊的一列資料都是同一個層級的,比如:
server: port: 8081 path: /example
注意:屬性key和值都是大小寫敏感的
4、YAML支援的資料結構
字面量:普通的值(整數、浮點數、字串、布林、Null值、時間、日期)
key: value(字面值直接寫上就可以)
字串也預設不需要加上單引號和雙引號的
單引號:會轉義特殊字元,將特殊字元轉為一個普通的字串
name: 'xiaowang \n' 列印 xiaowang \n (ps:這裡的\n被轉成字串)
雙引號:不會轉義特殊字元,特殊字元還是表達其本身想表示的意思
name: 'xiaowang \n' 列印 xiaowang 換行 (ps:這裡的\n執行換行操作)物件:也可以說是map,也就是鍵值對的形式
key: value(以物件屬性key:value的形式表示,在物件名下一行寫屬性:屬性值,,同樣注意空格縮排)
example:
user:
username: root
password: rootpwd
也可以用行內寫法表示:
user:{username: root,password: rootpwd}
- 陣列:也可以說是list或者序列的方式表示
用"-"符合+值的方式陣列中一個元素
pets:
- cat
- dog
顯然也有行內寫法,用[]中括號表示
pets: [cat,dog]
5、例子實踐
ok,上面的都是一些必要的理論,下面開始實踐,yaml使用的時候,經常是組合寫法的,也就是物件、字面值等等一起組合使用的,本文結合Springboot,介紹一下這種用法,在Springboot中,yaml語言被用於配置屬性,這種寫法很簡潔,值得推廣
在Springboot的application.yml檔案加上如下配置:
## 測試ConfigurationProperties
user:
userName: root
isAdmin: true
regTime: 2019/11/01
isOnline: 1
maps: {k1 : v1,k2: v2}
lists:
- list1
- list2
address:
tel: 15899988899
name: 上海市
編寫測試bean類進行對映
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* <pre>
* 將配置檔案中每個屬性都對映到這個元件,注意:記得加@Component註解,這樣才能將這個元件 * 載入到Spring容器中
* </pre>
*/
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private String userName;
private boolean isAdmin;
private Date regTime;
private Long isOnline;
private Map<String,Object> maps;
private List<Object> lists;
private Address address;
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", isAdmin=" + isAdmin +
", regTime=" + regTime +
", isOnline=" + isOnline +
", maps=" + maps +
", lists=" + lists +
", address=" + address +
'}';
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public boolean isAdmin() {
return isAdmin;
}
public void setAdmin(boolean admin) {
isAdmin = admin;
}
public Date getRegTime() {
return regTime;
}
public void setRegTime(Date regTime) {
this.regTime = regTime;
}
public Long getIsOnline() {
return isOnline;
}
public void setIsOnline(Long isOnline) {
this.isOnline = isOnline;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Address類:
public class Address {
private String tel;
private String name;
@Override
public String toString() {
return "Address{" +
"tel='" + tel + '\'' +
", name='" + name + '\'' +
'}';
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
寫個junit測試類來單元測試:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.muses.jeeplatform.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@org.springframework.boot.test.context.SpringBootTest
public class SpringBootTest {
@Autowired
User user;
@Test
public void testConfigurationProperties(){
System.out.println(user);
}
}
User{userName='root', isAdmin=false, regTime=Fri Nov 01 00:00:00 CST 2019, isOnline=1, maps={k1=v1, k2=v2}, lists=[list1, list2], address=Address{tel='15899988899', name='上海市'}}