java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring @Value通过${}、#{}注入不同类型值

Spring @Value如何通过${}、#{}注入不同类型的值

作者:少爷晚安。

这篇文章主要介绍了Spring @Value如何通过${}、#{}注入不同类型的值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Spring @Value通过${}、#{}注入不同类型值

@Value有两种注入方式

"${}"可以设置默认值,当从配置文件中获取不到时,若没有设置默认值,则会抛异常。

//在指定的配置路径后面加冒号,在冒号后面给定默认值
@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;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文