Spring @Value如何通过${}、#{}注入不同类型的值
作者:少爷晚安。
这篇文章主要介绍了Spring @Value如何通过${}、#{}注入不同类型的值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Spring @Value通过${}、#{}注入不同类型值
@Value有两种注入方式
@Value("${}")
:自定义参数获取,获取对应属性文件(yml或properties文件)中自定义的属性@Value("#{}")
:SpEL表达式,获取Bean的某个属性或调用其某个方法,还可以表示常量
"${}"
可以设置默认值,当从配置文件中获取不到时,若没有设置默认值,则会抛异常。
//在指定的配置路径后面加冒号,在冒号后面给定默认值 @Value("${constants.test:hello}")
注意:
${}和#{}可以嵌套使用,但必须#{}外面,${}在里面,先会执行${},因为spring执行${}的时机要早于#{}。
不同类型注入
yml配置文件:
constants: test: string: test integer: 3 list: a,b,c other: a.b.c map: "{key1:'var1', key2:'var2'}"
ps:以下所有类型注入都参考如上配置文件!!!
String
@Value("${constants.test.string:test}") private String value; @Value("#{'test'}") private String value;
Integer
@Value("${constants.test.integer:3}") private Integer value; @Value("#{3}") private Integer value;
List
@Value("${constants.test.list:var1,var2,var3}") private List<String> sList;
上面这种方式只能使用,
逗号隔开,其他字符不会分割,不然会看成是一个整体的字符串
@Value("#{'${constants.test.other}'.split('.')}") private List<String> sList;
#{}
和${}
嵌套使用,其中${constants.test.other}
是一个String类型的Bean,split
方法是用来分割字符串,.
为指定的分割符,当然也可以换成其他字符,但一定要和${constants.test.other}
配置的一致
Map
@Value("#{${constants.test.map}}") private Map<String, Object> map;
注意上面的map解析中,一定要用"
双引号把map所对应的constants.test.map
的值包起来,要不然解析会失败,导致不能转成 Map。
异常信息:
Could not resolve placeholder 'constants.test.map' in value "#{${constants.test.map}}"
指定类型的Bean
@Configuration public class Config { @Bean("myRestTemplate") public RestTemplate restTemplate() { return new RestTemplateBuilder().build(); } }
@Value("#{myRestTemplate}") private RestTemplate restTemplate;
静态属性赋值
spring 不允许/不支持把值注入到静态变量。
@Value("${constants.test.string}") private static String value;
如上操作,最后变量value的结果是等于null值。
解决方法:
spring支持set方法注入,我们可以利用非静态setter 方法注入静态变量。
private static String value; @Value("${constants.test.string}") public void setValue(String value) { this.value = value; }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。