Spring @Value 应用参考

本文带你了解@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表达式计算赋值。