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取这个对象来获取值

相关文章
相关标签/搜索