本文带你了解@value注解使用。@value用于给spring管理的bean字段注入值,可以在字段、构造函数、方法参数上使用。
示例准备 为了描述@value注解的多种应用方式,我们需要一个简单spring应用配置类。通常我们使用属性文件定义需要通过@value注入的值。当然,我们首先需要在配置上添加@PropertySource,并指定属性文件名称。
定义属性文件的内容如下:
value.from.file=Value got from the file
priority=Properties file
listOfValues=A,B,C
使用示例
最基本很少使用的用法是通过注解注入字符串值。
@Value("string value")
private String stringValue;
使用@PropertySource注解可以使用属性文件中的值,在下面示例中把文件中的值赋给bean属性:
@Value("${value.from.file}")
private String valueFromFile;
我们也可以通过系统属性赋值,下面示例假设我们定义了一个系统属性,名称为systemValue:
@Value("${systemValue}")
private String systemValue;
通过缺省属性可以给bean属性指定缺省值,避免属性没有定义时取不到值,示例如下:
@Value("${unknown.param:some default}")
private String someDefault;
如果系统属性和属性文件中都定义相同的属性,那么系统属性优先被使用。
假设我们有一个priority 属性定义在系统属性中,值为“System property” ,同时在属性文件中也定义了,值为任何其他值。下面示例的代码中值最终为“System property” 。
@Value("${priority}")
private String prioritySystemProperty;
有时我们需要注入多个值。在系统属性或属性文件中通过定义逗号分割值赋值给数组类型属性。前面我们定义的属性文件中listOfValues为多值情况,所以下面示例数组值为: [“A”, “B”, “C”]。
@Value("${listOfValues}")
private String[] valuesArray;
SPEL示例
我们也可以使用SpEL表达式获取值,假设有priority系统属性,通过SpEL赋值代码如下:
@Value("#{systemProperties['priority']}")
private String spelValue;
如没有定义系统属性,则赋值为null。为了避免null,可以在SpEL中提供缺省值,下面示例“some default” 作为缺省值:
@Value("#{systemProperties['unknown'] ?: 'some default'}")
private String spelSomeDefault;
另外,可以使用其他bean的属性值。假设someBean有属性someValue,值为10.则下面属性值为10.
@Value("#{someBean.someValue}")
private Integer someBeanValue;
我们也可以List属性赋值,下面示例属性值为A, B, C:
@Value("#{'${listOfValues}'.split(',')}")
private List<String> valuesList;
总结
本文通过示例简要展示了 @Value几种不同的用法,可以从属性文件或系统属性中取值,也可以通过SpEL表达式计算赋值。
ps:
spring @Value注解#和$区别
一直以来,在使用@Value注解的时候,都是使用#的风格@Value("#{topic.topicName}"),但是也经常会看到@Value("${topic.topicName}")风格的属性注入,今天特地研究了下区别:
- $注入的就是<context:property-placeholder location="classpath:config/*.properties" />加载的所有属性;
- #则是spring EL,所以其实#{topic.topicName}就是一个topic对象的topicName属性,在实际中,通常使用的方式是在spring配置文件中包含一个<util:properties id="application" location="classpath:config/application.properties" />,然后以#{application.topicName}的方式来使用。不过这种方式的限制就是因为是Spring EL,所以application.properties中以“."分隔的属性无法直接注入,因为不被认为是一个对象,所以要写成@Value("#{application['topic.topicName'] ?: 25}")。
既然注入参数,就有可能有些情况下会有默认值的情况,同理,这两种方式对于默认值的语法要求是不同的,对于以属性方式$注入的,格式为${ property : default_value }。对于以spring EL方式注入的,则为#{ obj.property?: default_value },注意这里?:是一个操作符,而不是两个操作符,这和java的java三元表达式有点不同。
例子可以参考:
http://www.cnblogs.com/larryzeal/p/5910149.html
spring EL可以参考:
http://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/expressions.html |