【spring】@Value注解学习

2024-03-28 10:12
文章标签 java 学习 spring 注解 value

本文主要是介绍【spring】@Value注解学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

@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注解使用场景

  1. 读取配置文件中的属性值:@Value 注解可以读取配置文件中的属性值,并将其注入到字段、方法参数或方法返回值中。例如,我们可以使用 @Value 注解读取数据库连接信息、缓存配置信息等。

  2. 读取系统属性:@Value 注解可以使用 SpEL 表达式来读取系统属性,例如操作系统名称、用户名等。

  3. 读取环境变量:@Value 注解可以使用 SpEL 表达式来读取环境变量,例如 JAVA_HOMEPATH 等。

  4. 读取随机数:@Value 注解可以使用 SpEL 表达式来生成随机数,例如 #{T(java.util.UUID).randomUUID().toString()} 可以生成一个 UUID。

  5. 读取其他 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 表达式中,#$ 有着不同的含义和用途:

  1. $ 符号

    • $ 用于从属性或环境中解析引用。
    • 它可以用来引用配置文件中的属性,系统属性,环境变量,或者任何在 Spring 容器中定义的 Bean 的属性。
    • 当你在 @Value 注解中使用 $ 时,Spring 会尝试在配置文件或环境中查找相应的值。

    例如:

    @Value("${some.property}") 
    private String someProperty;

    这里,${some.property} 将会被解析为配置文件中 some.property 键对应的值。

  2. # 符号

    • # 用于执行 SpEL 表达式。
    • 它允许你执行更复杂的操作,比如调用方法、访问对象属性、执行算术运算等。
    • 使用 # 时,Spring 会将大括号内的内容作为 SpEL 表达式进行求值。

    例如:

    @Value("#{T(java.lang.Math).random() * 10}") 
    private double randomValue;

    在这个例子中,#{...} 内的表达式是一个 SpEL 表达式,它调用了 java.lang.Math 类的 random() 方法,并将其结果乘以 100,然后将这个值注入到 randomValue 字段中。




这篇关于【spring】@Value注解学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855322

相关文章

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2