@Value介绍
@Value
是 Spring 框架中一个非常有用的注解,它允许你将来自配置文件、系统属性、环境变量或者通过 SpEL(Spring Expression Language)表达式计算得出的值注入到 Spring 管理的 Bean 中。这个注解可以用在字段、setter 方法或者构造函数参数上。
@Value源码
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {String value();}
源代码截图
@Value属性介绍
- value:指定要向Bean的属性中注入的数据,数据可以是配置文件中的配置项,并且支持EL表达式。
@Value注解使用场景
-
读取配置文件中的属性值:
@Value
注解可以读取配置文件中的属性值,并将其注入到字段、方法参数或方法返回值中。例如,我们可以使用@Value
注解读取数据库连接信息、缓存配置信息等。 -
读取系统属性:
@Value
注解可以使用 SpEL 表达式来读取系统属性,例如操作系统名称、用户名等。 -
读取环境变量:
@Value
注解可以使用 SpEL 表达式来读取环境变量,例如JAVA_HOME
、PATH
等。 -
读取随机数:
@Value
注解可以使用 SpEL 表达式来生成随机数,例如#{T(java.util.UUID).randomUUID().toString()}
可以生成一个 UUID。 -
读取其他 Bean 的属性值:
@Value
注解可以使用 SpEL 表达式来读取其他 Bean 的属性值,例如#{@otherBean.propertyName}
可以读取其他 Bean 的属性值。
@Value测试示例代码
ValueDemo类
package com.yang.SpringTest.annotation.valueLearn;import lombok.Data;
import org.springframework.stereotype.Component;/*** <p></p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.valueLearn* Ceate Time 2024-03-25 17:29*/
@Data
@Component
public class ValueDemo {private String valueName = "test a @Value";}
ValueDemoConfig配置类
package com.yang.SpringTest.annotation.valueLearn;import lombok.ToString;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.Resource;/*** <p>ValueDemoConfig配置类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.valueLearn* Ceate Time 2024-03-25 17:29*/
@ToString
@Configuration
@ComponentScan(value = {"com.yang.SpringTest.annotation.valueLearn"})
@PropertySource(value = {"classpath:valueDemo.properties"})
public class ValueDemoConfig {/*** 注入普通字符串*/@Value("Test Value String")private String testString;/*** 注入工程根目录*/@Value("#{systemProperties['user.dir']}")private String userDir;/*** 注入表达式的结果*/@Value("#{ T(java.lang.Math).random() * 10.0 }")private double randomValue;/*** 注入其他Bean的属性*/@Value("#{valueDemo.valueName}")private String valueDemoName;/*** 注入配置文件中的值*/@Value("${valueDemoString}")private String vvalueDemoString;/*** 注入文件资源*/@Value("classpath:valueDemo.properties")private Resource resourceFile;/*** 注入URL资源*/@Value("https://www.sohu.com/")private Resource url;}
ValueDemoTest测试类
package com.yang.SpringTest.annotation.valueLearn;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** <p>ValueDemoTest测试类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.valueLearn* Ceate Time 2024-03-25 17:36*/
@Slf4j
public class ValueDemoTest {public static void main (String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext (ValueDemoConfig.class);ValueDemoConfig valueConfig = context.getBean (ValueDemoConfig.class);log.info ("valueConfig:{}", valueConfig.toString ());}
}
运行结果:
valueConfig: ValueDemoConfig(testString=Test Value String, userDir=D:\company\SpringTest, randomValue=9.462457639760082, valueDemoName=test a @Value, vvalueDemoString=chengxuyuanshitang, resourceFile=class path resource [valueDemo.properties], url=URL [https://www.sohu.com/]
)
在 SpEL 表达式中,#
和 $
有着不同的含义和用途:
-
$
符号:$
用于从属性或环境中解析引用。- 它可以用来引用配置文件中的属性,系统属性,环境变量,或者任何在 Spring 容器中定义的 Bean 的属性。
- 当你在
@Value
注解中使用$
时,Spring 会尝试在配置文件或环境中查找相应的值。
例如:
@Value("${some.property}") private String someProperty;
这里,
${some.property}
将会被解析为配置文件中some.property
键对应的值。 -
#
符号:#
用于执行 SpEL 表达式。- 它允许你执行更复杂的操作,比如调用方法、访问对象属性、执行算术运算等。
- 使用
#
时,Spring 会将大括号内的内容作为 SpEL 表达式进行求值。
例如:
@Value("#{T(java.lang.Math).random() * 10}") private double randomValue;
在这个例子中,
#{...}
内的表达式是一个 SpEL 表达式,它调用了java.lang.Math
类的random()
方法,并将其结果乘以 100,然后将这个值注入到randomValue
字段中。