【Spring Boot 中 `@Value` 注解的使用】

news2025/3/20 22:00:56

文章目录

  • 一、前言
  • 二、@Value 注解简介
  • 三、@Value 注解的常见用法
    • 1. 读取 `application.properties` 或 `application.yml` 配置值
      • (1)配置文件示例
      • (2)Java 代码示例
      • (3)测试输出
    • 2. 使用 `@Value` 设置默认值
    • 3. 读取系统环境变量和 Java 运行时参数
    • 4. 结合 Spring Expression Language (SpEL)
      • (1)基本 SpEL 表达式
      • (2)引用 Bean 的属性
    • 5. 读取数组、集合和 Map 类型数据
      • (1)读取数组
      • (2)读取 `List`
      • (3)读取 `Map`
  • 四、@Value 和 `@ConfigurationProperties` 对比
  • 五、总结


一、前言

在 Spring Boot 项目中通常需要从 application.propertiesapplication.yml 配置文件中读取配置信息。@Value 注解提供了一种简单的方式来将配置值注入到 Spring 组件中。


二、@Value 注解简介

@Value 是 Spring 提供的一个注解,用于从配置文件或其他来源(如系统环境变量、SpEL 表达式)中读取值并注入到 Bean 的字段或方法参数中。其基本语法如下:

@Value("${property.key}")
private String propertyValue;

三、@Value 注解的常见用法

1. 读取 application.propertiesapplication.yml 配置值

(1)配置文件示例

application.properties

app.name=Spring Boot Demo
app.version=1.0.0

application.yml

app:
  name: Spring Boot Demo
  version: 1.0.0

(2)Java 代码示例

@Component
public class AppConfig {

    @Value("${app.name}")
    private String appName;

    @Value("${app.version}")
    private String appVersion;

    public void printConfig() {
        System.out.println("Application Name: " + appName);
        System.out.println("Application Version: " + appVersion);
    }
}

(3)测试输出

Application Name: Spring Boot Demo
Application Version: 1.0.0

2. 使用 @Value 设置默认值

如果配置文件中未定义某个属性,则 @Value 注解可以提供一个默认值。默认值的语法是 :${defaultValue}

@Component
public class DefaultValueExample {

    @Value("${app.author:Unknown Author}")
    private String author;

    public void printAuthor() {
        System.out.println("Application Author: " + author);
    }
}

如果 application.propertiesapplication.yml 中未配置 app.author,则输出:

Application Author: Unknown Author

3. 读取系统环境变量和 Java 运行时参数

@Value 也可以用于读取系统环境变量或 -D 方式传递的 JVM 运行参数:

@Component
public class EnvConfig {

    @Value("${JAVA_HOME}")
    private String javaHome;

    @Value("${user.name}")
    private String userName;

    public void printSystemProperties() {
        System.out.println("JAVA_HOME: " + javaHome);
        System.out.println("User Name: " + userName);
    }
}

如果运行环境变量设置了 JAVA_HOME=/usr/lib/jvm/java-11-openjdk,则输出:

JAVA_HOME: /usr/lib/jvm/java-11-openjdk
User Name: admin

4. 结合 Spring Expression Language (SpEL)

@Value 注解支持 Spring 表达式语言(SpEL),可用于动态计算值。

(1)基本 SpEL 表达式

@Component
public class SpELExample {

    @Value("#{2 * 5}")
    private int result;

    public void printResult() {
        System.out.println("Result: " + result);
    }
}

输出:

Result: 10

(2)引用 Bean 的属性

@Component
public class AnotherBean {
    private String message = "Hello from AnotherBean";

    public String getMessage() {
        return message;
    }
}

@Component
public class BeanReferenceExample {

    @Autowired
    private AnotherBean anotherBean;

    @Value("#{anotherBean.message}")
    private String messageFromAnotherBean;

    public void printMessage() {
        System.out.println(messageFromAnotherBean);
    }
}

输出:

Hello from AnotherBean

5. 读取数组、集合和 Map 类型数据

(1)读取数组

app.servers=192.168.1.1,192.168.1.2,192.168.1.3
@Component
public class ArrayConfig {

    @Value("${app.servers}")
    private String[] servers;

    public void printServers() {
        System.out.println(Arrays.toString(servers));
    }
}

输出:

[192.168.1.1, 192.168.1.2, 192.168.1.3]

(2)读取 List

@Component
public class ListConfig {

    @Value("#{'${app.servers}'.split(',')}")
    private List<String> serverList;

    public void printServerList() {
        System.out.println(serverList);
    }
}

输出:

[192.168.1.1, 192.168.1.2, 192.168.1.3]

(3)读取 Map

app.db.config=username:admin,password:123456,url:jdbc:mysql://localhost:3306/test
@Component
public class MapConfig {

    @Value("#{${app.db.config}}")
    private Map<String, String> dbConfig;

    public void printDbConfig() {
        System.out.println(dbConfig);
    }
}

输出:

{username=admin, password=123456, url=jdbc:mysql://localhost:3306/test}

四、@Value 和 @ConfigurationProperties 对比

特性@Value@ConfigurationProperties
作用范围适用于单个值注入适用于整个配置对象映射
支持的数据类型主要用于 String、基本类型、数组可绑定复杂对象(如 List、Map、自定义对象)
代码简洁性适用于少量配置参数适用于大量配置参数
是否支持 SpEL支持不支持

示例:@ConfigurationProperties 用法

app.name=Spring Boot Demo
app.version=1.0.0
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppProperties {
    private String name;
    private String version;

    // getter & setter
}

五、总结

  • @Value 注解用于将配置文件中的值注入到 Spring 组件中。
  • @Value 可用于读取 application.propertiesapplication.yml 中的值,并支持默认值。
  • @Value 还能用于读取环境变量、JVM 运行参数和 SpEL 表达式。
  • @Value 可以解析数组、List、Map 等数据结构。
  • 对于复杂配置推荐使用 @ConfigurationProperties,而 @Value 适用于简单值注入。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025年,电脑还需要分区吗?

随着2025年的到来&#xff0c;电脑存储空间已经不像以前那么金贵&#xff0c;固态硬盘&#xff08;SSD&#xff09;容量更大、速度更快&#xff0c;云存储也成了日常标配。许多人开始质疑&#xff1a;电脑还需要像以前那样分区吗&#xff1f; 一、分区到底是什么意思&#xff…

一个成功的Git分支模型

本作品原发布账号为【白鸽子中文网】&#xff0c;现转至当前账号【飞翔中文网】。 反思备录(2020/3/5) 这个模型构思于2010年&#xff0c;现已过去10余年&#xff0c;(2010年)那时正处于Git诞生后不久。在这10年间&#xff0c;git-flow(本文中提到的分支模型) 在许多软件队伍里…

Kafka可视化工具KafkaTool工具的使用

Kafka Tool工具 介绍 使用Kafka的小伙伴&#xff0c;有没有为无法直观地查看 Kafka 的 Topic 里的内容而发过愁呢&#xff1f;下面推荐给大家一款带有可视化页面的Kafka工具&#xff1a;Kafka Tool &#xff08;目前最新版本是 3.0.2&#xff09; 注意&#xff1a;以前叫Kafk…

【嵌入式Linux】基于ArmLinux的智能垃圾分类系统项目

目录 1. 功能需求2. Python基础2.1 特点2.2 Python基础知识2.3 dict嵌套简单说明 3. C语言调用Python3.1 搭建编译环境3.2 直接调用python语句3.3 调用无参python函数3.4 调用有参python函数 4. 阿里云垃圾识别方案4.1 接入阿里云4.2 C语言调用阿里云Python接口 5. 香橙派使用摄…

网络安全漏洞与修复 网络安全软件漏洞

文章目录 一、软件漏洞的概念 1、信息安全漏洞简述2、软件漏洞3、软件漏洞概念4、软件漏洞的成因分析 二、软件漏洞标准化管理 1、软件漏洞分类2、软件漏洞分级3、安全漏洞管理规范 一、软件漏洞的概念 1、信息安全漏洞简述 信息安全漏洞是信息安风险的主要根源之一&…

STM32:Default_Handler问题

记录代码进入Default_Handler错误的解决办法 一、 问题表述 在一次调试代码的时候&#xff0c;发现代码卡死在启动文件 startup_at32f423xx_.s 的367行&#xff0c;即 B. 处B.是汇编代码&#xff0c;B&#xff1a;跳转到一个标号&#xff0c;这里跳转到一个‘.’&#xff0c;…

iwebsec-SQL数字型注入

1.判断是否存在漏洞 添加and 11发现正常显示&#xff0c;添加and 12无回显条目&#xff0c;则存在sql注入漏洞 2.因为有回显&#xff0c;尝试union联合注入&#xff0c;使用order by判断出有3个字段 3.使用union联合注入查看回显位&#xff0c;发现3三个字段均有回显&#xff…

基于Spring Boot的冷链物流系统的设计与实现的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

LLM(6):理解词嵌入

深度神经网络模型&#xff0c;包括 LLM&#xff0c;无法直接处理原始文本。由于文本是分类的&#xff0c;它与用于实现和训练神经网络的数学操作不兼容。因此&#xff0c;我们需要一种方法来将词语表示为连续值向量。 注意&#xff1a;如果读者对向量和张量不太了解&#xff0c…

SQLMesh系列教程:利用date_spine宏构建日期序列实践指南

引言&#xff1a;为什么需要日期维度表&#xff1f; 在数据分析和报表开发中&#xff0c;日期维度表是不可或缺的基础结构&#xff0c;其中包括一定日期范围的日期序列&#xff0c;每个序列包括对应日期属性&#xff0c;如年季月日、是否周末等。无论是计算日粒度销售额、分析…

Java 大视界 -- 企业数字化转型中的 Java 大数据战略与实践(93)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

linux:环境变量,进程地址空间

一.命令行参数 main的参数&#xff1a;int argc,char*argv[]&#xff0c;char*env[] 1.参数意义&#xff1a; argc是命令行调用次程序时传递的参数 例&#xff1a; ls -l -a 传递了三个参数&#xff0c;“ls" "-l" "-a"三个字符串 argv是传递的参…

mybatis集合映射association与collection

官方文档&#xff1a;MyBatis的一对多关联关系 一、用途 一对一&#xff1a;association 一对多&#xff1a;collection 二、association 比较容易理解&#xff0c;可参考官方文档 三、collection <?xml version"1.0" encoding"UTF-8"?> &l…

【AIGC】Win10系统极速部署Docker+Ragflow+Dify

【AIGC】WIN10仅3步部署DockerRagflowDify 一、 Docker快速部署1.F2进入bios界面&#xff0c;按F7设置开启VMX虚拟化技术。保存并退出。2.打开控制面板配置开启服务3.到官网下载docker安装包&#xff0c;一键安装&#xff08;全部默认勾选&#xff09; 二、 RagFlow快速部署1.确…

全局上下文网络GCNet:创新架构提升视觉识别性能

摘要&#xff1a;本文介绍了全局上下文网络&#xff08;GCNet&#xff09;&#xff0c;通过深入分析非局部网络&#xff08;NLNet&#xff09;&#xff0c;发现其在重要视觉识别任务中学习的全局上下文与查询位置无关。基于此&#xff0c;提出简化的非局部模块、全局上下文建模…

鸿蒙NEXT项目实战-百得知识库03

代码仓地址&#xff0c;大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点&#xff1a; 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…

Linux上位机开发实战(qt编译之谜)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多同学都喜欢用IDE&#xff0c;也能理解。因为不管是visual studio qt插件&#xff0c;还是qt creator其实都帮我们做了很多额外的工作。这里面最…

【人工智能】【Python】在Scikit-Learn中使用网格搜索对决策树调参

这次实践课最大收获非网格搜索莫属。 # 导入包 import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split, GridSearchCV # 网格搜索 from sklearn.tree import DecisionTreeClassi…

用Python代码生成批量下单json

需求 根据以下json体&#xff0c;生成230OrderList对象生成10位有序的数字字母随机数赋值给OrderDetailList.ApiOrderId 和 OrderDetailList.Traceid生成的Json文件 保存在项目JSON目录中 {"UAccount": "xxxx","Password": "","…

TCP、UDP协议的应用、ServerSocket和Socket、DatagramSocket和DatagramPacket

DAY13.1 Java核心基础 TCP协议 TCP 协议是面向连接的运算层协议&#xff0c;比较复杂&#xff0c;应用程序在使用TCP协议之前必须建立连接&#xff0c;才能传输数据&#xff0c;数据传输完毕之后需要释放连接 就好比现实生活中的打电话&#xff0c;首先确保电话打通了才能进…