轉載請在頁首註明做者與出處html
YAML能夠代替傳統的xx.properties文件,可是它支持聲明map,數組,list,字符串,boolean值,數值,NULL,日期,基本知足開發過程當中的全部配置。java
長期以來,咱們使用xml配置文件與properties配置文件。可是YAML卻基本無人使用,故有了此文node
XML優勢:xml配置文件所用最多的地方就是spring的配置文件了。固然,它也很靈活,它以自定義的標籤能夠知足種種須要,並且能夠聲明多個一樣的標籤。mysql
XML缺點:配置起來麻煩,讀取繁瑣。redis
properties優勢:讀取簡單,配置簡單,spring能夠直接加載properties文件,不須要咱們寫代碼讀取。spring
properties缺點:可是不支持配置多個一樣的屬性,這是最大的缺點。sql
這裏演示一下properties的缺點。數組
假定我有一個應用場景,我須要配置多臺redis作爲redis的集羣。app
如今寫properties的配置文件ide
redis.ip=10.1.10.1 redis.port=6379 redis.password=123456
好吧,我只能配置一個。
固然,其實我也能夠這樣配置
#第一臺
redis1.ip=10.1.10.1 redis1.port=6379 redis1.password=123456
#第二臺
redis2.ip=10.1.10.1
redis2.port=6379 redis2.password=123456
以上面的這種配置,我基本上能夠無限的配置,可是這對於代碼上面讀取又是一個問題,我根本不知道配置文件中配置了多少個節點。
這個時候我會想到xml的配置方式,它靈活,多變。
<xml> <redis> <node> <ip>10.1.2.1</ip> <port>6379</port> <password>123</password> </node> <node> <ip>10.1.2.1</ip> <port>6379</port> <password>123</password> </node> <node> <ip>10.1.2.1</ip> <port>6379</port> <password>123</password> </node> <node> <ip>10.1.2.1</ip> <port>6379</port> <password>123</password> </node> </redis> </xml>
xml這種方式就徹底支持多個節點的配置,我只須要遍歷redis下的全部node節點就好了,可是它的配置與讀取就相對繁瑣了。
第一次接觸YAML是在spring-boot中的,剛開始接觸的時候也是有點抵制,可是慢慢的就愈來愈喜歡它了。
yml不能用製表符,必須輸入空格,可是能夠輸入任意個空格,只須要對齊就好了。
project:
redis:
ip: 10.8.16.232 #冒號後臺必須接空格,讀取的時候會去掉先後空格,用#能夠進行註釋
port: 6379
mysql:
url: jdbc://....
user: root
password: 111
這是一個簡單的yaml,它就至關於properties中的
project.redis.ip=10.8.16.232
project.redis.port=6379
project.mysql.url=xxx
project.mysql.root=12
project.mysq.password=xx
能夠看到yml就省略了前面的部分,而且在spring中,使用@Value()註解,一樣能夠把該值取出來
如今咱們用yml來解決以前遇到配置多個redis的問題
xx:
test:
hehe: normal
txtarray: 1,2,3,a #這種對象形式的,只能單獨寫一個對象去接收,因此沒法使用@value註解獲取
listmap:
- host: zxj
port: 10
active: 9
- host: ly
port: 11
active: 8
liststr:
- name
- value
map:
a: a
b: b
能夠看到在xxx.test.listmap中,咱們定義了兩個集合,以- 開頭的,就是表明着數組集合。
能夠參考 http://www.ruanyifeng.com/blog/2016/07/yaml.html?f=tt 來學習YAML的語法
在spring-boot中,定義一個application.yml,而後寫入上面的配置,
而後定義這樣一個類
import java.util.Arrays; import java.util.List; import java.util.Map; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * @author 朱小杰 * @since 2016年11月14日 上午10:33:36 * 版本 1.0<br> * @see 須要生成set方法 */ @Component @ConfigurationProperties(prefix = "xx.test") public class ConfigProperties { private String hehe; private String[] txtarray; private List<Map<String,String>> listmap; private List<String> liststr; private Map<String,String> map; /** * @param 設置 hehe */ public void setHehe(String hehe) { this.hehe = hehe; } /** * @param 設置 txtarray */ public void setTxtarray(String[] txtarray) { this.txtarray = txtarray; } /** * @param 設置 listmap */ public void setListmap(List<Map<String, String>> listmap) { this.listmap = listmap; } /** * @param 設置 liststr */ public void setListstr(List<String> liststr) { this.liststr = liststr; } /** * @return 獲取 hehe */ public String getHehe() { return hehe; } /** * @return 獲取 txtarray */ public String[] getTxtarray() { return txtarray; } /** * @return 獲取 listmap */ public List<Map<String, String>> getListmap() { return listmap; } /** * @return 獲取 liststr */ public List<String> getListstr() { return liststr; } /** * @return 獲取 map */ public Map<String, String> getMap() { return map; } /** * @param 設置 map */ public void setMap(Map<String, String> map) { this.map = map; } /** * @see [說明這個方法] * @return * @since 2016年11月14日 上午10:38:49 */ @Override public String toString() { return "ConfigProperties [hehe=" + hehe + ", txtarray=" + Arrays.toString(txtarray) + ", listmap=" + listmap + ", liststr=" + liststr + ", map=" + map + "]"; } }
屬性名必須與YAML中的參數名一致,必須聲明get/set方法,get與set都要。並且使用了yaml的對象,不能使用@Value("${}")註解來獲取值,固然,若是是普通的映射是能夠的,數組,map,list這種是不行的,只能經過上面的方式,注入到一個對象裏面去,
而後再@Autowird取這個對象來獲取值