SpringBoot中yaml配置對象

轉載請在頁首註明做者與出處html

 

一:前言

YAML能夠代替傳統的xx.properties文件,可是它支持聲明map,數組,list,字符串,boolean值,數值,NULL,日期,基本知足開發過程當中的全部配置。java

長期以來,咱們使用xml配置文件與properties配置文件。可是YAML卻基本無人使用,故有了此文node

 

 

二:經常使用配置文件的優缺點及演示

2.1:優缺點

XML優勢:xml配置文件所用最多的地方就是spring的配置文件了。固然,它也很靈活,它以自定義的標籤能夠知足種種須要,並且能夠聲明多個一樣的標籤。mysql

XML缺點:配置起來麻煩,讀取繁瑣。redis

properties優勢:讀取簡單,配置簡單,spring能夠直接加載properties文件,不須要咱們寫代碼讀取。spring

properties缺點:可是不支持配置多個一樣的屬性,這是最大的缺點。sql

 

 

 

 

2.2:優缺點演示

這裏演示一下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的配置文件

第一次接觸YAML是在spring-boot中的,剛開始接觸的時候也是有點抵制,可是慢慢的就愈來愈喜歡它了。

 

 

3.1:基本用法

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()註解,一樣能夠把該值取出來

 

 

 

3.2:配置對象

如今咱們用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的語法

 

 

 

 

3.2:java讀取

在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取這個對象來獲取值

相關文章
相關標籤/搜索