SpringBoot中读取yml各种类型的参数

2,060 阅读4分钟

springBoot项目中经常需要读取yml文件中的配置,一般有两种常见的方式: 1.使用 @value2.使用 @ConfigurationProperties 生成配置类 。当然也可以采用第三种方式:注入org.springframework.core.env.Environment 然后从该对象中去查找。因为第三种用起来不太方便,一般情况下我们使用前面2种就够了,这次也主要介绍 @value@ConfigurationProperties

@Value

单属性

  • String

    @Value("${value.name}")
    private String name;
    
    value:
      name: test
    
  • Integer

    @Value("${value.age}")
    private nteger age;
    
    value:
      age: 10
    

数组

//数组默认使用 , 作为分隔符
@Value("${value.phone}")
private Integer[] phones;

//也可以指定分隔符
@Value("#{'${value.phone}'.split(',')}")
private Integer[] phones2;
value:
  phone: 123, 4566 ,  789

注意,字符串数组参数中即使某个元素跟分隔符(比如 , )之间有间隔,解析的时候照样会被去除掉,比如phone: 123, 4566 , 789 解析出来的3个元素就是 123 、 4566 和 789 每个元素都不包含空格

List

list 参数的形式跟数组是一样的,只要将声明的成员变量/对象 改成List类型即可。

@Value("${value.phone}")
private List<Integer> list;
value:
  phone: 123, 4566 ,  789

map

使用 @value 解析map 时,是比较麻烦,需要集合EL表达式一起使用

@Value("#{${value.map}}")
private Map<String, String> map;
value:
  ## '' 必须要有, 如果key或者value 中有中文,必须要用 ""包起来
  map: '{one: "第一个mapvalue", two: "第二个mapvalue"}'

注意,map 对应的值必须使用 ``(单引号)包起来; 第二,如果key 或者 value 有中文时必须使用 "" (双引号包起来)

@ConfigurationProperties

使用 @ConfigurationProperties 是将一堆拥有相同前缀的参数注入到一个配置bean中进行管理。这里有两个关键点:1.是一个bean , 所以一般需要 @Component ; 2,是把一堆拥有相同前缀的参数注入,所以需要使用 @ConfigurationProperties(prefix = "beanconfig") ,其中 beanconfig 就是配置参数的前缀

接下来的配置都是在一个参数配置bean中进行的

@Component
@ConfigurationProperties(prefix = "beanconfig")
@Data
public class BeanConfigData { 

}

单属性

  • String

    private String name;
    
    beanconfig:
      name: test
    
  • Integer

    private nteger age;
    
    beanconfig:
      age: 10
    

    注意,因为类上已经指定了前缀 beanconfig ,所以只要保证属性名跟配置参数一致就行了

数组

private String[] arr;
beanconfig:
  arr: 123 , 456, 789

List

private List<String> list;
beanconfig:
  list: 123 , 456, 789

map

  • Map<String,String>
private Map<String, String> map;
beanconfig:
  map:
    one: 第一个mapvalue
    two: 第二个mapvalue
  • Map<String,List>
private Map<String, List<String>> map2;
beanconfig:
  map2:
    list1:
      - list1第一个mapvalue
      - list1第二个mapvalue
    list2:
      - list2第一个mapvalue
      - list2第二个mapvalue
    list3: list3第一个mapvalue, list3第2个mapvalue

注意,可能有人发现map2 的 list3 好像有些不一样,实际上这样混着写也是没问题的,只是为了演示另一种数组的写法

对象

private Company company;
@Data
public class Company {

    private String email;
}
beanconfig:
  company:
    email: 123@qq.com

其他注意的地方

空格处理

如果参数值中有字符串,会被自动去除

比如

beanconfig:
  list: 123 ,456,  789

虽然list 的3个元素与分隔符 , 之间有空格,但是使用注解获得的3个元素只有数字123 456 789 ,中间的空格都被去掉

转义字符处理

如果参数值中有转义字符,比如制表符 \t

value:
  name: anan\t

这种写法,那么处理结果就是 String name = "anan\t" ; 制表符不会起效果。

System.out.println(name + "结果");
//输出结果就是 anan\t结果

使用双引号将值包起来,即可使转义符生效

value:
  name: "anan\t"

这样即可使制表符生效 ,处理结果就是 tring name = "anan\t" ;

System.out.println(name + "结果");
//输出结果就是 anan	结果

配置参数引用其他配置参数

使用 ${其他参数即可}

value:
  city: "beijing"
  birth: ${value.city} 市海淀区

整型参数异常

  • 先看一个例子:
value:
  age: 0122
 private Integer age;

请问 age = 122 吗? ,不 age = 82

这是因为 yaml语法对于整型支持 二进制八进制十六进制 ,01 开头被识别成 8进制 ,八进制的 0122 就是 82 。

  • 继续看另外一个例子:
value:
  age: 0122
 private String age;

请问 age = "0122" 吗? 不 age = "87" , 原因跟上面是一样的

因此在写 String类型的参数时,尽量用"" (双引号)将字符串包起来,以避免出现错误