Spring 提供了@Value
注解来支持资源的注入,可以很便捷的让属性值注入到组件中,当值不存在可以设置一个默认值。
@Value 注解还可以结合 Spring EL 表达式获取 Spring 容器中的 Bean 的值,以 #{}
进行表达式声明。
- @Value:使用
${}
声明,从外部配置的参数取值。
- SpringEL:使用
#{}
声明,使用表达式获取变量的值。
#{}
与 ${}
可以混合使用,必须是 #{}
在外,${}
在里面。
注入资源包括
- 注入配置文件属性
- 注入普通字符串
- 注入操作系统属性(系统环境)
- 注入表达式结果
- 注入其它Bean属性
- 注入文件资源
注入资源示例
设置默认值
以 :
分隔,前半部分是配置属性的 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
文件,写入内容。