【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.rhkb.cn/news/288656.html

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

相关文章

自动化面试常见算法题!

1、实现一个数字的反转&#xff0c;比如输入12345&#xff0c;输出54321 num 12345 num_str str(num) reversed_num_str num_str[::-1] reversed_num int(reversed_num_str) print(reversed_num) # 输出 54321代码解析&#xff1a;首先将输入的数字转换为字符串&#xff…

【研发日记】Matlab/Simulink开箱报告(十)——Signal Routing模块模块

文章目录 前言 Signal Routing模块 虚拟模块和虚拟信号 Mux和Demux Vector Concatenate和Selector Bus Creator和Bus Selector 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;五&#xff09;——S-Fuction模块(C MEX S-Fun…

python学习15:python中的input语句

python中的input语句 我们前面学习过print语句&#xff0c;可以将内容输出到屏幕上&#xff1b;在python中&#xff0c;与之对应的还有一个input语句&#xff0c;用来获取键盘输入。 数据输出&#xff1a;print 数据输入&#xff1a;input 使用上也很简单&#xff1a; 使用inp…

LIS、LCS算法模型

文章目录 1.LCS算法模型2.LIS算法模型 1.LCS算法模型 LCS问题就是给定两个序列A和B&#xff0c;求他们最长的公共子序列。 在求解时&#xff0c;我们会设dp[i][j]表示为A[1 ~ i]序列和B[1 ~ j]序列中&#xff08;不规定结尾&#xff09;的最长子序列的长度。 if(a[i]b[i]) dp…

信号处理--情绪分类数据集DEAP预处理(python版)

关于 DEAP数据集是一个常用的情绪分类公共数据&#xff0c;在日常研究中经常被使用到。如何合理地预处理DEAP数据集&#xff0c;对于后端任务的成功与否&#xff0c;非常重要。本文主要介绍DEAP数据集的预处理流程。 工具 图片来源&#xff1a;DEAP: A Dataset for Emotion A…

从零开始为香橙派orangepi zero 3移植主线linux——1.uboot

从零开始为香橙派orangepi zero 3移植主线linux——1.uboot 0.前言一、准备二、制作引导文件1.BL312.SCP firmware (Crust)3.uboot 三、烧录四、运行 0.前言 之前买了块香橙派zero3&#xff0c;CPU是全志H618&#xff0c;四核cortex-A53&#xff0c;烧录了官方的ubuntu系统后就…

《论文阅读》PAGE:一个用于会话情绪原因蕴含基于位置感知的图模型 ICASSP 2023

《论文阅读》PAGE&#xff1a;一个用于会话情绪原因蕴含基于位置感知的图模型 ICASSP 2023 前言 简介任务定义模型构架Utterances Encoding with EmotionPosition-aware GraphCausal Classifier实验结果 前言 亲身阅读感受分享&#xff0c;细节画图解释&#xff0c;再也不用担…

2024年腾讯云4核8G服务器多少钱一年?买1年送3个月

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机器学习(深度学习)判断网络入侵

文章目录 下载数据集NSL-KDD数据集介绍输入的41个特征输出的含义数据处理&&训练技巧建神经网络&#xff0c;输入41个特征&#xff0c;输出是那种类别的攻击模型训练模型推理写gradio前端界面&#xff0c;用户自己输入41个特征&#xff0c;后端用模型推理计算后显示出是…

微服务(基础篇-006-Docker)

Docker是一个开源的应用容器引擎&#xff0c;它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何Linux机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间没有任何接口&#xff08;类似 iPhone 的 app&…

【OpenCV】 OpenCV (C++) 与 OpenCvSharp (C#) 之间数据通信

OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成&#xff0c;同时提供了Python、Ruby、MATLAB等语…

阿里云实时计算Flink的产品化思考与实践【上】

摘要&#xff1a;本文整理自阿里云高级产品专家黄鹏程和阿里云技术专家陈婧敏在 FFA 2023 平台建设专场中的分享。内容主要为以下五部分&#xff1a; 阿里云实时计算 Flink 简介产品化思考产品化实践SQL 产品化思考及实践展望 该主题由黄鹏程和陈婧敏共同完成&#xff0c;前半程…

BaseDao封装JavaWeb的增删改查

目录 什么是BaseDao&#xff1f; 为什么需要BaseDao&#xff1f; BaseDao的实现逻辑 什么是BaseDao&#xff1f; Basedao 是一种基于数据访问对象&#xff08;Data Access Object&#xff09;模式的设计方法。它是一个用于处理数据库操作的基础类&#xff0c;负责封装数据库…

Adobe推出20多个,企业版生成式AI定制、微调服务

3月27日&#xff0c;全球多媒体领导者Adobe在拉斯维加斯召开“Summit 2024”大会&#xff0c;重磅推出了Firefly Services。 Firefly Services提供了20 多个生成式AI和创意API服务&#xff0c;支持企业自有数据对模型进行定制、微调&#xff0c;同时可以与PS、Illustrator、Ex…

高级DBA带你处理MySQL客户端程序频繁访问MYSQL数据库并错误链接不释放导致连接数爆满事故实战

高级DBA带你处理MySQL客户端程序频繁访问MYSQL数据库并错误链接不释放导致连接数爆满事故实战 一、生产事故描述 Mysql生产数据库最大连接数爆满&#xff0c;其余客户端也同样拿不到数据库连接&#xff0c;生产异常&#xff0c;数据传输失败&#xff01; 报错如下&#xff1a…

架构师之路--Docker的技术学习路径

Docker 的技术学习路径 一、引言 Docker 是一个开源的应用容器引擎&#xff0c;它可以让开发者将应用程序及其依赖包打包成一个可移植的容器&#xff0c;然后在任何支持 Docker 的操作系统上运行。Docker 具有轻量级、快速部署、可移植性强等优点&#xff0c;因此在现代软件开…

解决kubesphere流水线docker登陆错误http: server gave HTTP response to HTTPS client

kubesphere DevOps流水线中&#xff0c;在登录私有的harbor仓库时&#xff0c;报以下错误 docker login 111.230.19.120:80 -u admin -p test123. WARNING! Using --password via the CLI is insecure. Use --password-stdin. Error response from daemon: Get "https://…

使用vue构建一个简单实用的春节红包插件!

摘要&#xff1a;本文将介绍如何使用Vue.js构建一个简单实用的春节红包插件。该插件通过模拟红包的打开和关闭过程&#xff0c;以及金额的随机分配&#xff0c;为春节红包活动提供了一个有趣且互动的体验。 一、引言 在春节这个充满欢乐和祝福的时刻&#xff0c;红包成为了传递…

pt-archiver的实践分享,及为何要用 ob-archiver 归档数据的探讨

作者简介&#xff1a;肖杨&#xff0c;软件开发工程师 在数据密集型业务场景中&#xff0c;数据管理策略是否有效至关重要&#xff0c;它直接关系到系统性能与存储效率的提升。数据归档作为该策略的关键环节&#xff0c;不仅有助于优化数据库性能&#xff0c;还能有效降低存储成…

11.2024

插入排序 代码&#xff1a; public class 第十一题 {public static void main(String[] args) {int a[]{2,2,1,6,4,9,7,6,8};for (int k1;k<a.length;k){int sk-1;//排好序的最后一位int sssa[k];//记录哨兵的值while (s>0&&sss<a[s]){a[s1]a[s];s--;}a[s1]…