有三种注入方式,分别是基于配置文件注入、基于非配置文件注入、默认值注入。
1、配置文件
基于配置文件注入,顾名思义起源头来自于配置文件。这些配置文件诸如application.properties或自定义的*.properties文件。
例如,application.properties配置文件中定义属性值的形式如下:
user.name=admin
假设存在自定义配置文件my.properties,配置文件中定义的属性如下:
user.password=123456
如果需要做在类中使用这两个配置值如何做呢,看如下编码:
@PropertySource(“classpath:my.properties”)
@RestController
public class ValueController {
/**
* 获取位于application.properties中配置的属性
*/
@Value("${user.name}")
private String name;
/**
* 获取位于my.properties中的配置属性
*/
@Value("${user.password}")
private String password;
}
从上面代码可以看出从application.properties配置中获取user.name的信息填充到变量name中,再从自定义配置文件my.properties中获取user.password信息填充到password变量中。
需要注意的是,如果是自定义的my.properties文件,需要在某个类中通过@PropertySource引入该配置文件,而application.properties中的属性会自动被加载。
通过@Value注入单个属性的同时,也可以注入数组和列表形式。如果存在以下配置:
tools=car,train,airplane
那么可以通过如下代码进行注入:
/**
- 注入数组(自动根据","分割)
*/
@Value("${tools}")
private String[] toolArray;
/**
- 注入列表形式(自动根据","分割)
*/
@Value("${tools}")
private List toolList;
Spring默认情况下会以“,”进行分割,将配置文件中的tool包含内容切割成“car”、“train”、“airplane”组成的数组或者列表然后保存到toolArray的数组和toolList的列表中。
2、非配置文件
基于非配置文件注入,需要用到SpEL(Spring Expression Language)即Spring表达式语言对@Value进行修饰从而传递配置信息。
下面就来看看应用场景:
注入普通字符串,相当于直接给属性默认值,代码如下:
@Value(“测试”)
private String wechatSubscription;
注入操作系统属性,例如操作系统的名字,代码如下:
@Value("#{systemProperties[‘os.name’]}")
private String systemPropertiesName;
注入表达式结果,代码如下:
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber;
注入其他Bean属性:注入config对象的属性tool,代码如下:
@Value("#{config.tool}")
private String tool;
注入列表形式(自动根据"|"分割),代码如下:
@Value("#{’${words}’.split(’\|’)}")
private List numList;
注入文件资源,代码如下:
@Value(“classpath:config.xml”)
private Resource resourceFile;
注入URL资源,代码如下:
@Value(“http://www.choupangxia.com”)
private URL homePage;
3、默认值
说了配置文件和非配置文件的@Value注入,这里再加入默认值的注入方式,顾名思义就是在配置为空或者没有设置具体值的时候,使用的默认值填充目标对象。这里我们整理了几种情况供大家参考。
如果属性中未配置IP,则使用默认值,代码如下:
@Value("${ip:127.0.0.1}")
private String ip;
如果系统属性中未获取到port的值,则使用8888,代码如下:
@Value("#{systemProperties[‘port’]?:‘8888’}")
private String port;
其中${}中直接使用“:”对未定义或为空的值进行默认值设置,而#{}则需要使用“?:”对未设置的属性进行默认值设置。