springBoot项目中经常需要读取yml文件中的配置,一般有两种常见的方式: 1.使用 @value , 2.使用 @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类型的参数时,尽量用"" (双引号)将字符串包起来,以避免出现错误