Spring(十四) @Value注解与Spring EL表达式注入属性值

Spring 提供了@Value注解来支持资源的注入,可以很便捷的让属性值注入到组件中,当值不存在可以设置一个默认值。

@Value 注解还可以结合 Spring EL 表达式获取 Spring 容器中的 Bean 的值,以 #{}进行表达式声明。

  • @Value:使用 ${}声明,从外部配置的参数取值。
  • SpringEL:使用 #{}声明,使用表达式获取变量的值。
  • #{}${}可以混合使用,必须是 #{}在外,${}在里面。

注入资源包括

  1. 注入配置文件属性
  2. 注入普通字符串
  3. 注入操作系统属性(系统环境)
  4. 注入表达式结果
  5. 注入其它Bean属性
  6. 注入文件资源

注入资源示例

设置默认值

:分隔,前半部分是配置属性的 Key,后半部分是默认值。

1
2
@Value("${some.key:default_value}")
private String stringWithBlankDefaultValue;

设置默认空字符串

1
2
@Value("${some.key:}")
private String stringWithBlankDefaultValue;

设置默认null值

1
2
@Value("${some.key:#{null}}")
private String stringNullableDefaultValue;

注意:如果使用 @Value("${some.key:null}")设置默认值,实际拿到的会是 "null" 字符串。

设置原始类型值

1
2
3
4
5
@Value("${boolean.value:true}")
private boolean booleanValue;

@Value("${int.value:16}")
private int intValue;

注入配置文件属性

1
2
@Value("${some.value}")
private String value;

注入普通字符串

1
2
@Value("Hello World")
private String normalString;

注入List属性值

1
2
@Value("${cluster.node}")
private List<String> nodes;

属性配置:

1
2
3
cluster.node[0]=192.168.0.1
cluster.node[1]=192.168.0.1
cluster.node[2]=192.168.0.1

此方式会报错:Could not resolve placeholder 'cluster.node' in value "${cluster.node}"

配置属性类注入:

可以先建一个配置类,定义一个数组名的 List 类型属性,就可以正确将属性值注入到 List。如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
@ConfigurationProperties("cluster")
public class ClusterNode {

private List<String> node;

public List<String> getNode() {
return node;
}

public void setNode(List<String> node) {
this.node = node;
}
}

使用时注入:

1
2
@Autowired
private ClusterNode clusterNode;

Spring EL 表达式注入:默认使用 ,分隔。

注意:${}需要用单引号包起来,注入 Map 则不需要。

1
2
3
4
5
6
7
8
9
10
11
12
13
@Value("#{'${some.name}'}")
private List<String> someName;

// 设置默认值
@Value("#{'${some.hobby1:read,music,run,food}'}")
private List<String> hobby1;

// 指定分隔符
@Value("#{'${some.hobby2:read/run/food}'.trim().split('/')}")
private List<String> hobby2;

@Value("#{'${some.name}'.trim().split(',')}")
private List<String> someName;

属性配置如下:

1
2
3
some.name=Kitty,Tom,Fei,Boot
some.hobby1=read,music,run,food,eat
some.hobby2=read/music/run/food/eat

注入Map属性值

1
2
3
4
5
6
@Value("#{${key.secret}}")
private Map<String,String> maps;

// 设置默认值
@Value("#{${appid.secret:{'appid10':'Secret10','appid20':'Secret20'}}}")
private Map<String,String> mapWithDefault;

在 Properties 文件中设置如下属性

1
key.secret={'Key1':'Secret1','Key2':'Secret2'}

注入操作系统属性

1
2
@Value("#{systemProperties['os.name']}")
private String osName;

注入静态方法的值

1
2
3
4
5
@Value("#{ T(java.lang.Math).random() * 100}")
private Integer intRandomNumber;

@Value("#{ T(java.lang.Math).random() * 100.0}")
private Double doubleRandomNumber;

注入其它Bean的值

1
2
@Value("#{webConfig.beanValue}")
private String beanValue;

Bean 中的属性

1
2
3
4
5
6
7
@Data
@Configuration
public class WebConfig {

@Value("${bean.value}")
private String beanValue;
}

注入文件资源

1
2
@Value("classpath:demo.txt")
private Resource demoFile;

在类路径下,创建一个 demo.txt 文件,写入内容。

Spring(十四) @Value注解与Spring EL表达式注入属性值

http://blog.gxitsky.com/2018/04/16/Spring-14-at-Value-SpringEL/

作者

光星

发布于

2018-04-16

更新于

2022-08-14

许可协议

评论