Spring 教程

Spring 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/spring_framework-annotation-value.html

spring @Value 属性注解注入使用详解

Spring 常用注解介绍 Spring 常用注解介绍


Spring @Value 注解用于为变量方法参数分配配置值或默认值。@Value 注解可以读取 spring 环境变量系统变量,也可以显性指定默认值。@Value 注解注入值有三种方式,分别为 @Value("${xxx}")@Value("#{xxx}")@Value("xxx")

  1. 美元 $ 符号开头的注入方式主要是读取 spring 的环境配置信息和系统信息,并设置其值到变量;
  2. 井符号 # 开头的注入方式,其实是 spring 的表达式语言 SpEL(Spring Expression Language),这种表达方式也可以获取系统信息,同时也可以获取 spring bean 的变量信息;
  3. 第三种就是直接显性指定默认值。

@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

 

Spring 依赖注入方式主要有 2 种,一是通过 @Autowire、@Resource 等注解注入,二是通过构造器的方式进行依赖注入。除 ...
@Value注解是Lombok中的一个注解,它用于生成一个不可变(immutable)的Java类,该类包含了一些常用的方法,如构造函数、e ...
Spring Cloud 中允许服务发现可以使用 @EnableDiscoveryClient 或 @EnableEurekaClient ...
@NoArgsConstructor和@AllArgsConstructor是Lombok库中的两个常用注解,它们用于自动生成无参构造函数和 ...
@Getter和@Setter是两个常用的Lombok注解,它们用于自动生成Java类中属性字段的getter和setter方法。SOURC ...