@Value在开发中最常使用的几个注解之一,通常用来获取配置文件中的属性。
不过除了从配置文件中获取值,@Value还支持使用默认值、表达式等方式为变量设置值。
本文就针对@Value的使用进行分享。
@Value用法
@Value中直接设置值
顾名思义这种方式就是在@Value中为属性赋值,且基本的数据类型都可以通过这种方式赋值。
如下示例为String、int、float、boolean等类型的变量进行了赋值。
@Value("testValue")
private String defaultString;
@Value("123")
private Integer defaultInt;
@Value("123.9")
private Float defaultFloat;
@Value("123333321")
private Long defaultLong;
@Value("true")
private Boolean defaultBoolean;
除了基础类型,对于list类型也可以通过这种方式赋值
@Value("{test:'valueTest'}")
private Map<String, String> defaultMap;
@Value("12,123,321")
private List<Integer> defaultList;
map 应该也可以通过这种方式赋值,但是我通过下边的几种方式赋值都失败了,追了一下源码中的TypeConverterSupport.convertIfNecessary的方法,但是并没有找到类型转换失败的原因。
有知道通过这种方式怎么注入map的同志可以交流下。
@Value("{test:'valueTest'}")
private Map<String, String> defaultMap;
@Value("{test:\"valueTest\"}")
private Map<String, String> defaultMapV2;
@Value("{\"test\":\"valueTest\"}")
private Map<String, String> defaultMapV3;
@Value中使用spel表达式
@Value中使用表达式对属性赋值,需要用到 #{},并且相应的对于基础类型,复杂类型也都可以赋值。
这里比较特殊的是map类型,用表达式 “#{{key:‘testValue’,key2:12344}}” 可以赋值,猜测应该是直接写map的方式无法完成类型转换。
另一个比较特殊的使用方式是最后一个,@Value(“#{readConfigService.testConfigId}”) 这里readConfigService是另一个bean,testConfigId是这个bean里的属性。所以 在进行属性注入的时候,可以注入其他bean中的属性。
@Value("#{'sss'}")
private String spelStringValue;
@Value("#{123}")
private Integer spelIntValue;
@Value("#{123.33}")
private Float spelFloatValue;
@Value("#{true}")
private Boolean spelBooleanValue;
@Value("#{'123,1231,123123'.split(',')}")
private List<Integer> spelListValue;
@Value("#{{key:'testValue',key2:12344}}")
private Map<String, Object> spelMapValue;
@Value("#{readConfigService.testConfigId}")
private String spelClazzValue;
@Value中使用$占位符
通过占位符注入配置中的值,需要使用 ${} 也就是我们开发中最常用的方式。
@Value("${value.string}")
private String phStringValue;
@Value("${value.int}")
private String phIntValue;
@Value("${value.float}")
private String phFloatValue;
@Value("${value.boolean}")
private String phBooleanValue;
@Value("${value.list}")
private List<Object> phListValue;
@Value("#{${value.maps}}")
private Map<String, Object> phMapValue;
上边给出了使用占位符注入属性的示例,其中有一点需要注意一下。
map需要和spel表达式结合,才能完成完成注入,即 “#{${value.maps}}” 这种方式,而且在yml配置文件中,也需要注意value前后是需要有 "
value:
string: 1aass
int: 123
float: 123.33
boolean: true
maps: "{test1:'value1',test2:'value2',test3:123}"
list: 123,qwe,asd,231.3
总结
这一篇文章主要是对@Value的不同使用方法进行了介绍,没有过于深入的解析。
本文旨在自我学习记忆,同时让大家知道@Value还有这么多的使用方式。其实这篇文章偏于奇淫巧技的介绍,下次见到类似的使用,我们不发懵就可以咯~~
引用
关于@Value表达式的使用
value注入map
@Value注入map、list