@Value注解可以通过#{}和${}等2中方式使用,其作用通常如下:
@Value(“#{}”) 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以直接表示常量。
用@Value(“${}”)注解一般从配置文件读取属性。
1 非配置文件注入
1.1 用法
通过@Value将外部的值动态注入到Bean中,常见用法如下:
- 注入普通字符串
- 注入操作系统属性
- 注入表达式结果
- 注入其他Bean属性
- 注入beanInject对象的属性another
- 注入文件资源
- 注入URL资源
非配置文件注入在实际开发场景中使用的较少,@value大部分情况注入配置文件中的属性
1.2 示例
注入普通字符串
直接附在属性名上,在 Bean 初始化时,会赋初始值。
@Value("admin")
private String name;
注入系统属性
@Value("#{systemProperties['os.name']}")
private String osName;
注入其他bean的属性
注入User对象中的属性userName
@Value("#{User.userName}")
private String userName;
注入文件资源
@Value("classpath:com/ndtest/spring/configinject/config.txt")
private Resource resourceFile;
注入URL资源
@Value("http://www.baidu.com")
private Resource testUrl;
2 配置文件注入(重点)
SpringBoot 通过 @Value 注解将配置文件中的属性注入到容器内组件中(可用在 @Controller 、@Service 、@Configuration、@Component 等Spring托管的类中)
1.注入普通字符串
在 application.properties
配置文件中有如下配置:
userName=zhaoyp
我们可以使用@Value注解注入属性:
@Value("${userName}")
public String userName;
2.注入基本类型(最常使用)
这次我们使用yml文件作为配置文件,假设application.yml文件中定义了服务器的基本配置
client:
ipAddr: 222.95.84.124
sshPort: 22
sshUser: root
sshPass: Test!@#123
我们可以通过@Value注解注入属性
@Value("${client.ipAddr}")
private String ipAddr;
@Value("${client.sshPort}")
private Integer sshPort;
@Value("${client.sshUser}")
private String sshUser;
@Value("${client.sshPass}")
private String sshPass;
3.注入数组、List类型
假设配置文件如下:
ids=1,2,3
// 注入数组类型
@Value("${ids}")
public int[] arrIds;
// 注入List
@Value("#{'${ids}'.split(',')}")
public List<String> listIds;
3 @Value注解获取不到值的常见问题
1 使用static或者final修饰了tagValue
错误示范如下:
@Value("${ftpIP}")
private static String ftpIP;
@Value("${ftpUserName}")
private final String ftpUserName;
解决办法是移除static或final关键字。
2 使用该注解的类上面没有加注解
没有加注解即不能被spring管理(类没有加上@Component(或者@service等))
错误示范如下:
public class FTPManagerService {
@Value("${ftpIP}")
private static String ftpIP;
}
正确案例:
@Component // 检查注解是否遗漏
public class FTPManagerService {
@Value("${ftpIP}")
private static String ftpIP;
}
3 使用new关键字新建了实例,而没有使用@Autowired
错误用法以及正确案例如下
public class FTPManagerService {
@Value("${ftpIP}")
private static String ftpIP;
}
public class Test{
/*错误用法*/
FTPManagerService f = new FTPManagerService ();
/*正确用法*/
@Autowired
FTPManagerService f2;
}
以上便是@Value注解的使用方法以及踩坑案例,希望能帮到大家~