Springboot @Value注解的场景用法以及可能遇到的问题

@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注解的使用方法以及踩坑案例,希望能帮到大家~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值