【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 字段中。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/573170.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构初阶:排序

排序的概念及其运用 排序的概念 排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性 &#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&…

如何在家中使用手机平板电脑 公司iStoreOS软路由实现远程桌面

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能&#xff0c;也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处&#xff1a…

【漏洞复现】网络验证系统getInfo接口处存在SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

基于Pytorch的验证码识别模型应用

前言 在做OCR文字识别的时候&#xff0c;或多或少会接触一些验证码图片&#xff0c;这里收集了一些验证码图片&#xff0c;可以对验证码进行识别&#xff0c;可以识别4到6位&#xff0c;纯数字型、数字字母型和纯字母型的一些验证码&#xff0c;准确率还是相当高&#xff0c;需…

机器学习——LightGBM算法

机器学习——LightGBM算法 摘要&#xff1a; LightGBM是一种高效的梯度提升框架&#xff0c;它在处理大规模数据时表现出色&#xff0c;并且具有较快的训练速度和较低的内存消耗。本文将介绍LightGBM算法的原理、特点以及与传统GBDT算法的区别&#xff0c;并使用Python对其进行…

亚马逊云科技:基于老服务器打造的旧实例类型

内容摘要&#xff1a; 2021年&#xff0c;距离第一个EC2实例上线已经十五周年了。 在漫长的开发过程中&#xff0c;很多EC2实例自然会基于旧服务器构建。 随着时间的推移&#xff0c;旧的服务器总是需要更换硬件&#xff0c;实例也得更换&#xff0c;但并不是所有的用户都想迁…

CCF-CSP真题202206-2《寻宝!大冒险!》

题目背景 暑假要到了。可惜由于种种原因&#xff0c;小 P 原本的出游计划取消。失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期……直到…… 某天&#xff0c;小 P 获得了一张神秘的藏宝图。 问题描述 西西艾弗岛上种有 n 棵树&#xff0c;这些树的具体位置记录在…

vue3+threejs新手从零开发卡牌游戏(十七):模拟对方手牌上场

写一个模拟对方手牌上场的事件&#xff0c;其中注意上场后卡牌需要翻转下&#xff0c;同时调整攻击力文字位置&#xff0c;主要代码如下&#xff1a; utils/common.ts&#xff1a; import { nextTick } from vue; import * as THREE from three; import * as TWEEN from tween…

Oracle VM(虚拟机)性能监控工具

Oracle VM是一个独立的虚拟化环境&#xff0c;由 Oracle 提供支持和设计&#xff0c;旨在为运行虚拟机提供轻量级、安全的基于服务器的平台。Oracle VM 能够在受支持的虚拟化环境中部署操作系统和应用软件&#xff0c;Oracle VM 将用户和管理员与底层虚拟化技术隔离开来&#x…

Python(django)之单一接口展示功能前端开发

1、代码 建立apis_manage.html 代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>测试平台</title> </head> <body role"document"> <nav c…

数据结构——二叉搜索树详解

一、二叉搜索树定义 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 1.非空左子树上所有节点的值都小于根节点的值。 2.非空右子树上所有节点的值都大于根节点的值。 3.左右子树也都为二叉搜索树。 如下图所示&#xff1a…

java中的单例模式

一、描述 单例模式就是程序中一个类只能有一个对象实例 举个例子: //引出单例模式&#xff0c;一个类中只能由一个对象实例 public class Singleton1 {private static Singleton1 instance new Singleton1();//通过这个方法来获取实例public static Singleton1 getInstance…