java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Springboot @Value注解场景用法

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

作者:NJUPT_zhaoyp

这篇文章主要给大家介绍了关于Springboot中@Value注解的场景用法及可能遇到问题的相关资料, @Value通常用于注入外部化属性,即外部配置属性的注入,文中通过图文介绍的非常详细,需要的朋友可以参考下

前言

@Value注解可以通过#{}和${}等2中方式使用,其作用通常如下:

@Value(“#{}”) 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以直接表示常量。

用@Value(“${}”)注解一般从配置文件读取属性。

1 非配置文件注入

1.1 用法

通过@Value将外部的值动态注入到Bean中,常见用法如下:

非配置文件注入在实际开发场景中使用的较少,@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注解场景用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文