Spring @Value 注解用于为变量和方法参数分配配置值或默认值。@Value 注解可以读取 spring 环境变量和系统变量,也可以显性指定默认值。@Value 注解注入值有三种方式,分别为 @Value("${xxx}")
、@Value("#{xxx}")
和 @Value("xxx")
。
- 美元 $ 符号开头的注入方式主要是读取 spring 的环境配置信息和系统信息,并设置其值到变量;
- 井符号 # 开头的注入方式,其实是 spring 的表达式语言 SpEL(Spring Expression Language),这种表达方式也可以获取系统信息,同时也可以获取 spring bean 的变量信息;
- 第三种就是直接显性指定默认值。
@Value 通过 $ 表达式获取环境信息
@Value("${dollar.config}")
String dollarConfig;
如果在 spring 环境属性中找不到该键,则 spring 容器启动会报错。所以我们可以分配一个默认值,如果 spring 环境属性中缺少键,则该默认值将被分配。
@Value("${dollar.config:default}")
String dollarConfig;
默认值通过分号
;
隔开后再设置。
@Value 通过 $ 表达式获取系统信息
系统在填充到 Spring 环境时,它会读取所有系统环境变量并将其存储为属性。所以我们也可以使用 @Value 注解来分配系统变量。
@Value("${java.home}")
String javaHome;
@Value("${HOME}")
String homeDir;
@Value 通过 # SpEL 表达式获取系统信息
我们还可以使用带有 @Value 注释的 Spring 表达式语言。所以我们也可以使用 SpEL 读取 java home 系统属性。
@Value("#{systemProperties['java.home']}")
String javaHome;
如果指定的值不存在,也可以指定默认值,示例如下:
@Value("#{systemProperties['java.home1']?:'default_str'}")
String javaHome;
SpEL 表达式中也可以引用 Spring 容器内定义的 bean 对象,假设有 DemoBean 的 Spring bean 类,@Value 利用 bean 对象读取其内部属性值,示例如下:
@Component
public class DemoBean {
public String prop = "test";
}
bean 默认名称为 demoBean
,那获取其内部信息如下:
@Value("#{demoBean.prop}")
String prop;
@Value 的 SpEL 完整表达式为 @Value("#{ obj.property ? : default_value }"),其中 obj 代表对象,如上示例的 systemProperties 和 demoBean 都是 spring 环境中定义的 bean 对象。
@Value 通过 # 注入表达式结果
SpEL 支持表达式,可以把表达式的结果注入到属性,示例如下:
@Value("#{ T(java.lang.Math).random() * 100 }")
String randomNumber;
@Value 注入文件资源、网站资源
spring @Value 支持特定格式以支持注入文件资源,直接网站资源到 org.springframework.core.io.Resource
类对象中,具体示例如下:
@Value("https://www.baidu.com")
Resource url;
@Value("classpath:com/knowledgedict/hello/demo.txt")
Resource file;
@Value 针对方法进行注解
当在方法上找到 @Value 注解时,Spring 上下文将在加载所有 Spring 配置和 bean 时调用它。
如果方法有多个参数,则每个参数值都从方法注解映射。如果我们想为不同的参数提供不同的值,那么也可以直接对参数使用 @Value 注解。
@Value("Test")
public void printValues(String s, String v){} //both 's' and 'v' values will be 'Test'
@Value("Test")
public void printValues(String s, @Value("Data") String v){}
// s=Test, v=Data