@Value是Spring框架中用于从属性文件或配置文件中注入值的一种注解。它可以用于注入各种类型的值,包括字符串、整数、布尔值等。@Value注解的用法有以下几种:
- 从配置文件中获取值:@Value("#{xxxx}")。例如,如果有一个application.yaml文件,其中配置了user: userName: 张三,那么可以直接使用@Value(“#{user.userName}”)。
- 从系统属性中获取值:@Value("#{systemProperties['xxxx']}")。例如,要从系统属性获取'java.version'的值,可以使用@Value(“#{systemProperties['java.version']}")。
- 从系统环境变量中获取值:@Value("#{environment['xxxx']}")。例如,要从系统环境变量中获取'JAVA_HOME'的值,可以使用@Value(“#{environment['JAVA_HOME']}")。
- 默认值:如果在配置文件或系统属性中没有找到对应的值,那么将使用默认值。例如,@Value(“${user.add:shangdong}")表示如果找不到'user.add'的值,那么将使用'shangdong'作为默认值。
- 常量注入:还可以直接将一个值注入到一个字段中。例如,@Value("20")表示将'20'这个值注入到被注解的字段中。
- 数组属性注入:例如,配置项为user.nums: 1,2,3 ,引入为@Value("${user.nums:1,2,3}") private String[] valueName; 。
- 列表属性注入:springboot 2.4.x以上的版本可以复用上述3的方式,更早版本需要以下方式:@Value("#{'${value.valueName}'.split(',')}") private List<String> valueNames; 。
需要注意的是,@Value注解只能用于Spring管理的Bean中,不能用于普通的Java类中。此外,如果在配置文件中找不到对应的属性值,那么将使用默认值。如果配置文件中的属性值被注释掉了,那么也会使用默认值。
yml配置:
user:
userName: 张三
valueName: 1,3,4
spring:
application:
name: springboot
代码示例:
package xyz.qq66179820.springboot.config;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import java.util.List;
/**
* @Value 注解示例
*
* @author lihj
* @version 1.0.0
* @date 2023/11/5
*/
@Configuration
@ToString
public class ValueConfig {
/**
* 从配置文件中获取值
*/
@Value("${user.userName}")
public String userName;
/**
* 从系统属性中获取值
* 等同于 System.getProperty("java.version")
*/
@Value("#{systemProperties['java.version']}")
public String sysProperty;
/**
* 从系统环境变量中获取值
* 等同于 System.getenv("JAVA_HOME")
*/
@Value("#{environment['JAVA_HOME']}")
public String sysEvn;
/**
* 默认值
*/
@Value("${user.add:shangdong}")
public String strDefault;
/**
* 常量注入
*/
@Value("20")
public Integer age;
/**
* 数组属性注入
*/
@Value("${user.nums:1,2,3}")
public String[] nums;
/**
* 列表属性注入
* springboot 2.4 以前的版本需要已下发方式实现
*/
@Value("#{'${user.valueName}'.split(',')}")
public List<String> valueNames;
}
测试代码:
ApplicationContext run = SpringApplication.run(SpringbootBasicKnowledgeApplication.class, args);
ValueConfig bean = run.getBean(ValueConfig.class);
System.out.println("bean = " + bean);
输出:
bean = ValueConfig(userName=张三, sysProperty=1.8.0_241, sysEvn=C:\Java\jdk1.8.0_241, strDefault=shangdong, age=20, nums=[1, 2, 3], valueNames=[1, 3, 4])