当前位置: 首页 > news >正文

SpringBoot中@Value获取值和@ConfigurationProperties获取值用法及比较

SpringBoot中@Value获取值和@ConfigurationProperties获取值用法及比较
更新时间:2024年08月08日 09:41:48 作者:岳轩子
在Spring Boot中,@Value注解是一个非常有用的特性,它允许我们将外部的配置注入到我们的Bean中,@ConfigurationProperties用于将配置文件中的属性绑定到 Java Bean 上,本文介绍了@Value获取值和@ConfigurationProperties获取值用法及比较,需要的朋友可以参考下

  1. 简介

1.1 @value
在Spring Boot中,@Value注解是一个非常有用的特性,它允许我们将外部的配置(如application.properties或application.yml文件中的属性)注入到我们的Bean中。这对于读取配置信息,如数据库连接信息、服务地址等,非常有用。

基本用法

@Value注解可以应用于字段、setter方法或配置方法上。它使用SpEL(Spring Expression Language)表达式来读取配置值。

1.2 @ConfigurationProperties
@ConfigurationProperties 是 Spring Boot 提供的一个非常强大的注解,用于将配置文件中的属性绑定到 Java Bean 上。与 @Value 注解相比,@ConfigurationProperties 提供了更丰富的特性,比如松散绑定(relaxed binding)、JSR-303 数据校验以及复杂的类型绑定等。

基本用法

定义一个配置类:首先,你需要定义一个配置类,并使用 @ConfigurationProperties 注解来指定配置的前缀。
启用配置属性绑定:默认情况下,Spring Boot 会自动扫描带有 @ConfigurationProperties 注解的类,并将它们注册为 Spring 应用上下文中的 bean。但是,如果你想要精确地控制哪些配置类被注册,你可以在 @EnableConfigurationProperties 注解中指定它们。
在配置文件中设置属性:在 application.properties 或 application.yml 文件中设置与配置类属性相对应的配置项。

  1. 使用

2.1 @value的使用
首先创建springboot的项目

创建application.yml

person:name : 岳轩子sex : 雄age : 18birthday : 2002/2/31maps : { k1 : 20 , k2 : 21}lists : [小黄 , 小黑]dog:name : 旺财

创建Person.java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;import java.util.Date;
import java.util.List;
import java.util.Map;@Component
@Validated
public class Person {@Value("${person.name}")private String name;@Value("${person.sex}")private Character sex;@Value("${person.age}")private Integer age;@Value("${person.birthday}")private Date birthday;private Map<String, Integer> maps;private List<String> lists;private Dog dog;public String getName() {return name;}public void setName(String name) {this.name = name;}public Character getSex() {return sex;}public void setSex(Character sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Map<String, Integer> getMaps() {return maps;}public void setMaps(Map<String, Integer> maps) {this.maps = maps;}public List<String> getLists() {return lists;}public void setLists(List<String> lists) {this.lists = lists;}public Dog getDog() {return dog;}public void setDog(Dog dog) {this.dog = dog;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", sex=" + sex +", age=" + age +", birthday=" + birthday +", maps=" + maps +", lists=" + lists +", dog=" + dog +'}';}
}

2.2 @ConfigurationProperties的用法
创建Person2.java

package com.example.springbootdaily.model;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;import java.util.Date;
import java.util.List;
import java.util.Map;@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person2 {private String name;private Character sex;private Integer age;private Date birthday;private Map<String, Integer> maps;private List<String> lists;private Dog dog;public String getName() {return name;}public void setName(String name) {this.name = name;}public Character getSex() {return sex;}public void setSex(Character sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Map<String, Integer> getMaps() {return maps;}public void setMaps(Map<String, Integer> maps) {this.maps = maps;}public List<String> getLists() {return lists;}public void setLists(List<String> lists) {this.lists = lists;}public Dog getDog() {return dog;}public void setDog(Dog dog) {this.dog = dog;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", sex=" + sex +", age=" + age +", birthday=" + birthday +", maps=" + maps +", lists=" + lists +", dog=" + dog +'}';}
}
  1. 区别
    在这里插入图片描述

3.1 松散绑定
@ConfigurationProperties 的松散绑定(relaxed binding)是 Spring Boot 提供的一个特性,它允许你在配置文件中使用不同的命名风格(如驼峰命名、短横线分隔等),而 Spring Boot 能够自动地将其映射到 Java Bean 的属性上。这种特性使得配置文件的编写更加灵活,同时也使得 Java Bean 的属性命名更加符合 Java 的命名习惯。

松散绑定的工作原理:
当你使用 @ConfigurationProperties 注解来绑定配置文件中的属性时,Spring Boot 会尝试根据以下规则来匹配属性名:

驼峰命名与短横线分隔的互转:如果你的 Java Bean 属性使用驼峰命名(如 myProperty),那么你可以在配置文件中使用短横线分隔的形式(如 my-property)来设置这个属性的值。Spring Boot 会自动地将这两种命名风格进行转换。
忽略大小写:在松散绑定中,大小写通常会被忽略,但请注意,这取决于你使用的配置文件格式(如 YAML 是大小写敏感的,而 properties 文件则不是)。然而,即使对于大小写敏感的文件格式,Spring Boot 也会尝试以智能的方式匹配属性名。
环境变量:对于环境变量,松散绑定的规则也适用。通常,环境变量名使用大写字母和下划线(如 MY_PROPERTY),而 Java Bean 属性则使用驼峰命名。Spring Boot 能够处理这种差异。
例子

application.yml
这里的name中间加了一个线

person:na-me : 岳轩子sex : 雄age : 18birthday : 2002/2/31maps : { k1 : 20 , k2 : 21}lists : [小黄 , 小黑]dog:name : 旺财

仍然可以获取
运行结果:

Person{name=‘岳轩子’,
3.2 SpEL
SpEL(Spring Expression Language)是 Spring 框架中的一个功能强大的表达式语言,它支持在运行时查询和操作对象图。SpEL 是一种类似于 JSP EL(JavaServer Pages Expression Language)但功能更强大的表达式语言,它用于在运行时查询和操作数据。

主要用途

Bean 属性的动态访问:在 Spring 配置文件中,你可以使用 SpEL 来动态地访问和设置 Bean 的属性。
注解中的属性值:在 Spring 的注解中,你也可以使用 SpEL 来设置注解的属性值。
XML 配置中的属性值:在 Spring 的 XML 配置文件中,可以通过 标签的 value 或 ref 属性结合 SpEL 来设置属性值。
@Value 注解:在 Java 代码中,可以使用 @Value 注解结合 SpEL 来注入配置值或计算结果。

特点

功能强大:支持基本运算、关系运算、逻辑运算、正则表达式匹配、集合操作等。
易于使用:语法简洁,易于学习和使用。
集成性好:与 Spring 框架紧密结合,可以在 Spring 的各种场景中使用。

例子
在这里插入图片描述
运行结果

age=20,

3.3 JSP303数据校验
先导入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

这里是@Value,不支持

@Email
@Value("${person.name}")
private String name;

如果不是email的话,会报错
在这里插入图片描述
3.4 复杂类型封装
前面已经使用了,@Value不能封装map,list和对象类型
但是@ConfigurationProperties可以

以上就是SpringBoot中@Value获取值和@ConfigurationProperties获取值用法及比较的详细内容,更多关于@Value和@ConfigurationProperties比较的资料请关注脚本之家其它相关文章!

来源:
https://www.jb51.net/program/325543kt3.htm

相关文章:

SpringBoot中@Value获取值和@ConfigurationProperties获取值用法及比较

SpringBoot中Value获取值和ConfigurationProperties获取值用法及比较 更新时间&#xff1a;2024年08月08日 09:41:48 作者&#xff1a;岳轩子 在Spring Boot中,Value注解是一个非常有用的特性,它允许我们将外部的配置注入到我们的Bean中,ConfigurationProperties用于将配置文件…...

执行任务赚积分

题目描述 现有N个任务需要处理&#xff0c;同一时间只能处理一个任务&#xff0c;处理每个任务所需要的时间固定为1。 每个任务都有最晚处理时间限制和积分值&#xff0c;在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。 可用于处理任务的时间有限&#xff0c;请问…...

使用TLS解决Docker API暴露2375端口的问题

问题起因 由于本人开发环境是在 Windows&#xff0c;开发完成后需要使用 Dockerfile 打包镜像&#xff0c;这个过程需要有一个 Docker 服务完成&#xff0c;Windows 安装 Docker 会影响到很多环境&#xff0c;我又不想本地开虚拟机使用 Docker&#xff0c;于是我就索性使用服务…...

Pyspark中catalog的作用与常用方法

文章目录 Pyspark catalog用法catalog 介绍cache 缓存表uncache 清除缓存表cleanCache 清理所有缓存表createExternalTable 创建外部表currentDatabase 返回当前默认库tableExists 检查数据表是否存在&#xff0c;包含临时视图databaseExists 检查数据库是否存在dropGlobalTemp…...

聚焦2024数博会|与天空卫士一起探索AI与数据安全的融合应用

中国国际大数据产业博览会&#xff08;简称数博会&#xff09;&#xff0c;是全球首个以大数据为主题的博览会&#xff0c;自2015年创办以来&#xff0c;经过多年的深厚沉淀&#xff0c;数博会已发展成为国际知名、引领前沿趋势的专业展示合作平台。 2024年8月28日至30日&#…...

实战docker第二天——cuda11.8,pytorch基础环境docker打包

在容器化环境中打包CUDA和PyTorch基础环境&#xff0c;可以将所有相关的软件依赖和配置封装在一个Docker镜像中。这种方法确保了在不同环境中运行应用程序时的一致性和可移植性&#xff1a; Docker&#xff1a;提供了容器化技术&#xff0c;通过将应用程序及其所有依赖打包在一…...

企业数字化转型的利器:RFID资产管理系统

在当今数字化时代&#xff0c;资产管理的效率和精确度对企业的成功至关重要。常达智能物联的RFID资产管理系统&#xff0c;凭借其高效、智能的管理方式&#xff0c;成为众多企业在数字化转型中的关键工具。 RFID资产管理系统的核心优势 一、精准资产定位与追踪 常达智能物联的…...

matplotlib中文乱码问题

在使用Matplotlib进行数据可视化的过程中&#xff0c;经常会遇到中文乱码的问题。显示乱码是由于编码问题导致的&#xff0c;而matplotlib 默认使用ASCII 编码&#xff0c;但是当使用pyplot时&#xff0c;是支持unicode编码的&#xff0c;只是默认字体是英文字体&#xff0c;导…...

提高开发效率的实用工具库VueUse

VueUse中文网&#xff1a;https://vueuse.nodejs.cn/ 使用方法 安装依赖包 npm i vueuse/core单页面使用&#xff08;useThrottleFn举例&#xff09; import { useThrottleFn } from "vueuse/core"; // 表单提交 const handleSubmit useThrottleFn(() > {// 具…...

【数据结构】你真的学会了二叉树了吗,来做一做二叉树的算法题及选择题

文章目录 1. 二叉树算法题1.1 单值二叉树1.2 相同的树1.3 另一棵树的子树1.4 二叉树的遍历1.5 二叉树的构建及遍历 2. 二叉树选择题3. 结语 1. 二叉树算法题 1.1 单值二叉树 https://leetcode.cn/problems/univalued-binary-tree/description/ 1.2 相同的树 https://leetco…...

压力测试知识总结

压力测试知识总结 引言 随着信息技术的飞速发展&#xff0c;软件系统在各个行业中的应用越来越广泛&#xff0c;其稳定性和可靠性成为用户关注的焦点。压力测试作为软件测试中的一种重要方法&#xff0c;对于确保软件在高负载环境下的稳定性和可靠性具有重要意义。本文将从压…...

@import导入样式以及scss变量应用与static目录

import函数:使用import语句可以导入外联样式表&#xff0c;import后跟需要导入的外联样式表的相对路径&#xff0c;用;表示语句结束。 static目录:就是无论你有没有在这个目录里用过,它都会进行编译打包 import函数应用:先在在项目里创建一个common 目录, 目录里面分别创建css,…...

分类中的语义一致性约束:助力模型优化

前言 这里介绍一篇笔者在去年ACL上发表的一篇文章&#xff0c;使用了空间语义约束来提高多模态分类的效果&#xff0c;类似的思路笔者也在视频描述等方向进行了尝试&#xff0c;也都取得了不错的效果。这种建模时对特征进行有意义的划分和约束对模型还是很有帮助的&#xff0c;…...

前端框架介绍

前端框架是Web开发中不可或缺的工具&#xff0c;它们通过提供结构化的开发方式、模块化组件、响应式设计以及高效的性能优化&#xff0c;极大地简化了Web应用程序的开发过程。以下是对当前主流及新兴前端框架的详细介绍&#xff0c;这些框架不仅涵盖了广泛的功能&#xff0c;还…...

java基础知识-JVM知识详解

文章目录 一、JVM内存结构二、常见垃圾回收算法1. 标记-清除算法(Mark-Sweep Algorithm)2. 标记-整理算法(Mark-Compact Algorithm)3. 复制算法(Copying Algorithm)4. 分代收集算法(Generational Collection)5. 增量收集算法(Incremental Collection)6. 并行收集算法…...

流动会场:以声学专利为核心的完美移动场地—轻空间

流动会场作为一种全新的活动场所选择&#xff0c;凭借其便捷的移动性与先进的声学设计&#xff0c;正逐渐成为各类演出、会议和文化活动的热门场地。其独特之处不仅在于搭建速度快、灵活性高&#xff0c;还在于其核心技术——声学专利的强大支持。 专利声学设计&#xff0c;打造…...

深度学习(一)-感知机+神经网络+激活函数

深度学习概述 深度学习的特点 优点 性能更好 不需要特征工程 在大数据样本下有更好的性能 能解决某些传统机器学习无法解决的问题 缺点 小数据样本下性能不如机器学习 模型复杂 可解释性弱 深度学习与传统机器学习相同点 深度学习、机器学习是同一问题不同的解决方法 …...

目标检测-YOLOv4

YOLOv4介绍 YOLOv4 是 YOLO 系列的第四个版本&#xff0c;继承了 YOLOv3 的高效性&#xff0c;并通过大量优化和改进&#xff0c;在目标检测任务中实现了更高的精度和速度。相比 YOLOv3&#xff0c;YOLOv4 在框架设计、特征提取、训练策略等方面进行了全面升级。它在保持实时检…...

一台笔记本电脑的硬件都有哪些以及对应的功能

一台笔记本电脑的硬件通常包括多个关键组件&#xff0c;这些组件共同协作&#xff0c;确保电脑的正常运行。以下是笔记本电脑的主要硬件及其功能&#xff1a; 1. 中央处理器&#xff08;CPU&#xff09; 功能&#xff1a;CPU 是电脑的“大脑”&#xff0c;负责处理所有的计算…...

【程序分享1】第一性原理计算 + 数据处理程序

【1】第一性原理计算 数据处理程序 SMATool 程序&#xff1a;VASP QE 零温 有限温度 拉伸、剪切、双轴、维氏硬度的计算 ElasTool v3.0 程序&#xff1a;材料弹性和机械性能的高效计算和可视化工具包 VELAS 程序&#xff1a;用于弹性各向异性可视化和分析 Phasego 程序…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...