yml文件详解
基本語(yǔ)法
- 使用空格 Space 縮進(jìn)表示分層,不同層次之間的縮進(jìn)可以使用不同的空格數(shù)目,但是同層元素一定左對(duì)齊,即前面空格數(shù)目相同(不要使用tab)
- # 表示單行注釋
- 破折號(hào)后面跟一個(gè)空格(a dash and space)表示列表
- 用冒號(hào)和空格表示鍵值對(duì) key: value
- 簡(jiǎn)單數(shù)據(jù)(scalars,標(biāo)量數(shù)據(jù))可以不使用引號(hào)括起來(lái),包括字符串?dāng)?shù)據(jù)
- 用單引號(hào)或者雙引號(hào)括起來(lái)的被當(dāng)作字符串?dāng)?shù)據(jù),在單引號(hào)或雙引號(hào)中使用C風(fēng)格的轉(zhuǎn)義字符
1. 數(shù)組寫(xiě)法
- apple - orange - banana2. 對(duì)象
fruit:name: bananaamount: 3price: 4.993、對(duì)象數(shù)組
首先大結(jié)構(gòu)是數(shù)組,但是數(shù)組內(nèi)部是一個(gè)kv結(jié)構(gòu)的對(duì)象
-name: appleprice: 1.23 -name: orangeprice: 1.33 -name: bananaprice: 2.334. 數(shù)組對(duì)象
首先大結(jié)構(gòu)是對(duì)象,對(duì)象內(nèi)部的成員是數(shù)組
name:- apple- orange- banana price:- 4.99- 2.34- 3.995. 多維數(shù)組
- [apple, 3.88] - [orange, 3.99] - [banana, 2.99]用中括號(hào)包括起來(lái),形成一個(gè)二維數(shù)組,加載后的數(shù)據(jù)結(jié)構(gòu)如下
6. 對(duì)象的擴(kuò)展寫(xiě)法
對(duì)于kv結(jié)構(gòu)的對(duì)象,支持通過(guò)大括號(hào)的方式來(lái)替代,簡(jiǎn)化配置文件的行數(shù)
love: {name: apple, price: 2.99} hite: {name: orange, price: 1.99}特殊符號(hào)
—
使用—表示一個(gè)文檔的開(kāi)始;比如Springboot中profile的定義:
server:address: 192.168.1.100 --- spring:profiles: developmentserver:address: 127.0.0.1 --- spring:profiles: productionserver:address: 192.168.1.120代表定義了兩個(gè)profile,一個(gè)是development,一個(gè)production;也常常使用—來(lái)分割不同的內(nèi)容,比如記錄日志:
…
... 和---配合使用,在一個(gè)配置文件中代表一個(gè)文件的結(jié)束:
--- time: 20:03:20 player: Sammy Sosa action: strike (miss) ... --- time: 20:03:47 player: Sammy Sosa action: grand slam ...!!
YAML中使用!!做類(lèi)型強(qiáng)行轉(zhuǎn)換:
string:- !!str 54321- !!str true>,|
>在字符串中折疊換行(換行符被替換為空格),| 保留換行符,這兩個(gè)符號(hào)是YAML中字符串經(jīng)常使用的符號(hào),比如:
accomplishment: >Mark set a major leaguehome run record in 1998. stats: |65 Home Runs0.278 Batting Average那么結(jié)果是:
stats=65 Home Runs0.278 Batting Average,即**| 符號(hào)保留了換行符(值中的換行符)**,而accomplishment的結(jié)果為:
accomplishment=Mark set a major league home run record in 1998.即將換行符轉(zhuǎn)化成了空格;要注意一點(diǎn)的是,每行的文本前一定要有一個(gè)空格。
|符號(hào)常見(jiàn)用于在YAML中配置HTML片段:
|、|+、|-
三種配置都會(huì)自動(dòng)按配置中所寫(xiě)的換行來(lái)?yè)Q行,但是在文末會(huì)有一些區(qū)別,有的會(huì)增加一個(gè)空行,有的不會(huì),有的會(huì)新增兩個(gè)空行,具體說(shuō)明如下:
- |:文中自動(dòng)換行 + 文末新增一空行
- |+:文中自動(dòng)換行 + 文末新增兩空行
- |-:文中自動(dòng)換行 + 文末不新增行
>、>+、>-
三種配置都不會(huì)對(duì)配置中的換行進(jìn)行實(shí)際換行(即換行符被替換為空格),但是依然在文末的處理會(huì)有一些小區(qū)別,具體如下:
- >:文中不自動(dòng)換行 + 文末新增一空行
- >+:文中不自動(dòng)換行 + 文末新增兩空行
- >-:文中不自動(dòng)換行 + 文末不新增行
&,*
重復(fù)的內(nèi)容在YAML中可以使用**&來(lái)完成錨點(diǎn)定義**,使用*來(lái)完成錨點(diǎn)引用,例如:
hr: - Mark McGwire - &SS Sammy Sosa rbi: - *SS - Ken Griffey可以看到,在hr中,使用&SS為Sammy Sosa設(shè)置了一個(gè)錨點(diǎn)(引用),名稱(chēng)為SS,在rbi中,使用*SS完成了錨點(diǎn)使用,那么結(jié)果為:
{rbi=[Sammy Sosa, Ken Griffey], hr=[Mark McGwire, Sammy Sosa]}我們也可以這樣定義:
SS: &SS Sammy Sosa hr:- Mark McGwire- *SS rbi:- *SS - Ken Griffey注意,不能獨(dú)立的定義錨點(diǎn),比如不能直接這樣寫(xiě): &SS Sammy Sosa;另外,錨點(diǎn)能夠定義更復(fù)雜的內(nèi)容,比如:
default: &default- Mark McGwire- Sammy Sosa hr: *default那么hr相當(dāng)于引用了default的數(shù)組,注意,hr: *default要寫(xiě)在同一行。
<<
合并內(nèi)容。主要和錨點(diǎn)配合使用,可以將一個(gè)錨點(diǎn)內(nèi)容直接合并到一個(gè)對(duì)象中。來(lái)看一個(gè)示例:
merge:- &CENTER { x: 1, y: 2 }- &LEFT { x: 0, y: 2 }- &BIG { r: 10 }- &SMALL { r: 1 }sample1: <<: *CENTERr: 10sample2:<< : [ *CENTER, *BIG ]other: hahasample3:<< : [ *CENTER, *BIG ]r: 100在merge中,定義了四個(gè)錨點(diǎn),分別在sample中使用。
sample1中,<<: *CENTER意思是引用{x: 1,y: 2},并且合并到sample1中,那么合并的結(jié)果為:sample1={r=10, y=2, x=1}
sample2中,<<: [*CENTER, *BIG] 意思是聯(lián)合引用{x: 1,y: 2}和{r: 10},并且合并到sample2中,那么合并的結(jié)果為:sample2={other=haha, x=1, y=2, r=10}
sample3中,引入了*CENTER, *BIG,還使用了r: 100覆蓋了引入的r: 10,所以sample3值為:sample3={r=100, y=2, x=1}
有了合并,我們就可以在配置中,把相同的基礎(chǔ)配置抽取出來(lái),在不同的子配置中合并引用即可。
YAML文件讀寫(xiě)
在Java生態(tài)環(huán)境中,讀寫(xiě)YAML文件算是比較簡(jiǎn)單的一個(gè)事情了,一個(gè)是自己讀取文件,然后按照語(yǔ)法進(jìn)行解析(屬于自己造輪子);另外一個(gè)就是利用開(kāi)源庫(kù)來(lái)讀寫(xiě),這里當(dāng)然是選擇已經(jīng)頗為完善的開(kāi)源庫(kù)來(lái)處理了
1. 依賴(lài)
pom文件中添加maven依賴(lài),版本號(hào)查詢(xún)最新的即可
<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.17</version> </dependency>2. 封裝類(lèi)
public class YamlUtil {public static InputStream loadStream(String path) throws IOException {if (path.startsWith("http")) {URL url = new URL(path);return url.openStream();} else if (path.startsWith("/")) {return new FileInputStream(path);} else {return YamlUtil.class.getClassLoader().getResourceAsStream(path);}}public static <T> T loadConf(String path, Class<T> clz) throws IOException {try (InputStream inputStream = loadStream(path)) {Yaml yaml = new Yaml();return yaml.loadAs(inputStream, clz);}}public static <T> void dumpConf(String save, T obj) throws IOException {Yaml yaml = new Yaml();yaml.dump(obj, new BufferedWriter(new FileWriter(save)));} }高級(jí)語(yǔ)法
yml 文件中使用環(huán)境變量
Spring Boot 中可以用 spring.profiles.active 參數(shù)來(lái)指定系統(tǒng)環(huán)境,讓系統(tǒng)加載不同的配置文件。
可以在程序啟動(dòng)的時(shí)候加上參數(shù)來(lái)指定需要的配置
java -Dspring.profiles.active="dev" -jar user.jar當(dāng)然我們也可以事先設(shè)置好系統(tǒng)的環(huán)境變量
expoer SERVER_EVN=test然后在 yml 文件中用 active: ${SERVER_EVN} 來(lái)動(dòng)態(tài)的獲取系統(tǒng)已設(shè)置好的數(shù)據(jù)。這樣這臺(tái) test 服務(wù)器中的再啟動(dòng) Spring Boot 項(xiàng)目的時(shí)候就可以不用每次都去設(shè)置參數(shù)了。
同時(shí) yml 也支持 ${SERVER_EVN:dev} 這樣的方式來(lái)設(shè)置默認(rèn)值,此時(shí)如果環(huán)境變量中沒(méi)有 SERVER_EVN , active就會(huì)默認(rèn)設(shè)置為"dev"。
總結(jié)
- 上一篇: Maven-配置
- 下一篇: Spring Cloud异常