Springboot中@Value注解的场景用法及可能遇到的问题详解
作者:NJUPT_zhaoyp
前言
@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注解的使用方法以及踩坑案例,希望能帮到大家~
总结
到此这篇关于Springboot中@Value注解的场景用法及可能遇到的问题的文章就介绍到这了,更多相关Springboot @Value注解场景用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!