SpringBoot:ch03 yml 数据绑定示例

前言

Spring Boot 提供了强大的配置能力,通过 YAML 文件进行数据绑定是一种常见且便捷的方式。在本示例中,我们将演示如何利用 Spring Boot 的特性,通过 YAML 文件实现数据绑定。借助于 YAML 的简洁语法和结构化特性,我们能够轻松地管理应用程序的配置信息,使得配置文件更加清晰易读。通过本示例,您将了解如何利用 Spring Boot 快速、高效地实现 YAML 数据绑定,为您的应用程序提供灵活且可维护的配置管理。让我们开始吧,深入探索 Spring Boot 中 YAML 数据绑定的精髓!

 

一、前期准备

1、新建项目,结构如下

2、导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.17</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>edu.nf</groupId><artifactId>ch03</artifactId><version>0.0.1-SNAPSHOT</version><name>ch03</name><description>ch03</description><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image></configuration></plugin></plugins></build></project>

 这是一个 Maven 的 pom.xml 文件,它描述了一个 Spring Boot 项目的依赖关系和构建方式。

在这个文件中,我们定义了两个依赖项:

spring-boot-starter:这是一个 Spring Boot 的核心依赖,它包含了 Spring MVC、Spring Data JPA、Spring Security 等常用模块,并且自动配置了这些模块所需的环境。通过引入这个依赖,我们可以快速搭建一个基于 Spring Boot 的 Web 应用程序。

spring-boot-starter-test:这是一个 Spring Boot 的测试依赖,它提供了许多用于测试的工具和框架,例如 JUnit、Mockito、Hamcrest 等。通过引入这个依赖,我们可以轻松地编写和执行单元测试和集成测试。

此外,我们还定义了一个 Maven 插件 spring-boot-maven-plugin,用于将应用程序打包成一个可执行的 JAR 文件,以便于部署和运行。在这个插件中,我们还可以配置容器、端口等参数,以满足不同的应用程序需求。

总之,pom.xml 文件是 Spring Boot 项目的配置文件,它定义了项目的依赖关系和构建方式,并且通过 Maven 插件实现了对应用程序的打包和部署

 

二、第一种,值绑定

值绑定,使用 @value 注解精确指定节点的名称

1、新建一个 Student 类

@Component
@Data
public class Student {// 使用 @Value 注解和spell表达式将yml的节点值绑定到类的字段上@Value("${student.userId}")private Integer stuId;@Value("${student.userName}")private String stuName;@Value("${student.age}")private Integer age;
}

 这段代码是一个Spring组件,用于将YAML配置文件中的值映射到Java对象的字段上。

首先,使用了@Data注解,它会自动生成getter和setter方法、equals方法、hashCode方法以及toString方法。

然后,通过@Value注解来绑定YAML配置文件中的各个节点值到类的字段上。@Value注解中的"${student.userId}"等,是SpEL表达式,它会在运行时从YAML配置文件中读取对应节点的值,并将其赋值给类的字段。

例如,如果在YAML配置文件中有以下内容:

student:userId: 1001userName: qiuage: 18

那么在运行时,Student对象的stuId字段将被赋值为123,stuName字段将被赋值为"tom",age字段将被赋值为18。

总之,这段代码可以让你轻松地将YAML配置文件中的值映射到Java对象的字段上,方便你的代码使用。

2、测试

@SpringBootTest
@Slf4j
class Ch03ApplicationTests {@Autowiredprivate Student student;@Testvoid contextLoads() {log.info(student.getStuId().toString());log.info(student.getStuName());log.info(student.getAge().toString());}}

这段代码是一个Spring Boot的测试类,用于测试应用程序的上下文加载和配置是否正确。

首先,使用了@SpringBootTest注解,它表示这是一个Spring Boot的集成测试类。它会自动加载应用程序的上下文,并进行必要的配置。

然后,使用@Slf4j注解,它是Lombok库提供的注解,可以自动生成日志变量log。

接下来,通过@Autowired注解将Student对象注入到测试类中的student字段上。这样就可以在测试方法中使用该对象。

在contextLoads()方法中,通过调用student对象的getter方法,获取并打印stuId、stuName和age字段的值。这主要用于验证是否成功将YAML配置文件中的值绑定到Student对象的相应字段上。

通过日志输出,你可以在测试运行时查看stuId、stuName和age字段的值。

总结起来,这段代码用于测试Spring Boot应用程序的上下文加载和配置是否正确,并验证是否成功将YAML配置文件中的值绑定到相应的Java对象字段上。

 

运行结果:

三、第二种,松散绑定

使用 @ConfigurationProperties 注解,松散绑定只需要绑定指定节点的前缀即可,子节点在 yml 中可以依据约定, 使用驼峰模式(如:userName)、“—”线(如:允(user-name)、或者全大写加下划线(如:USER_NAME) 进行绑定即可。

1、还是使用 Student 类
​@Component
@Data
@ConfigurationProperties(prefix = "student.info")
public class Student {private Integer stuId;private String stuName;private Integer age;
}​

这段代码定义了一个名为 Student 的 Java 类,使用了 @Component@Data 注解,并且使用了 @ConfigurationProperties 注解对该类进行了配置。

@Component 注解表示这个类是 Spring 中的一个组件,会被 Spring 容器所管理。@Data 注解是 lombok 提供的注解,自动生成一些常用方法,如 gettersettertoString 等等。

@ConfigurationProperties(prefix = "student.info") 注解指定了该类的属性值从以 student.info 为前缀的配置项中获取。例如,配置文件中有如下配置:

# 数据值绑定
student:info:stuId: 1001stu-name: qiuAGE: 18

 则 Student 类中的 stuId 属性值为 1001stuName 属性值为 "qiu"age 属性值为 18

这里指定字段的格式我使用了三种,为的是演示可以这样去写,在实际开发中,大家最好是选择一种去使用,统一一点。

通过这种方式,我们可以将应用程序的配置信息与业务逻辑分离,使得配置文件更加清晰易读,同时也方便进行统一的配置管理。

测试的结果和值绑定到一样,就不测试了。需要注意的是,实体类的字段名称和yml配置的名称要一样,不能出现不一致的,不然会报错的。

2、绑定实体
1)新建一个 Card 实体类
@Data
public class Card {private String cardNum;}

使用 @Data 生成 get、set访问器就可以了。

2)在 Student 实体类中引入 Card 实体类为字段
@Component
@Data
@ConfigurationProperties(prefix = "student.info")
public class Student {private Integer stuId;private String stuName;private Integer age;// 实体private Card card;
}

 在原有的 Student 类基础上,新增了一个名为 card 的属性,并且类型为 Card

yml示例:

# 数据值绑定
student:info:stuId: 1001stu-name: qiuAGE: 18card:card-num: 4408812000

 则 Student 类中的 stuId 属性值为 1001stuName 属性值为 "qiu"age 属性值为 18。Card类中的 cardNum 为 4408812000.

3)测试
@SpringBootTest
@Slf4j
class Ch03ApplicationTests {@Autowiredprivate Student student;@Testvoid contextLoads() {log.info(student.getStuId().toString());log.info(student.getStuName());log.info(student.getAge().toString());log.info(student.getCard().getCardNum());}}

在contextLoads()方法中,使用日志记录器log输出了student对象的一些属性信息。通过调用student对象的get方法获取学生的学号、姓名、年龄以及身份证号码,并通过log.info()方法将它们输出到日志中。 

运行结果:

 3、绑定数组
1)在 student 实体类中新建一个字段
  // 数组private String[] tels;

yml中绑定 tels 的值:

  # 绑定 array,list,set 集合,多个值使用逗号分隔tels: # 13223453421,14556766700- 13223453421- 14556766700

这里呢有两种写法,一种是用逗号隔开,一种是使用 “-”线加空格隔开,不加空格的话,输出的时候会把 “-” 也输出来。

2)测试
@SpringBootTest
@Slf4j
class Ch03ApplicationTests {@Autowiredprivate Student student;@Testvoid contextLoads() {log.info(student.getStuId().toString());log.info(student.getStuName());log.info(student.getAge().toString());log.info(student.getCard().getCardNum());for (String tel : student.getTels()) {log.info(tel);}}}

绑定了一个数组,拿出来只需要循环就可以啦。

运行结果:

4、绑定 map 
1)在 Student 实体类中新建一个字段
 // mapprivate Map<String,Integer> score;

 yml 绑定 score 的值:

   # 绑定 mapscore:chinese: 85english: 60

 因为 map 是一以键值对保存数据的,所以这里的 Chinese 就是键,85 就是这个键的值。

 2)测试
@SpringBootTest
@Slf4j
class Ch03ApplicationTests {@Autowiredprivate Student student;@Testvoid contextLoads() {log.info(student.getStuId().toString());log.info(student.getStuName());log.info(student.getAge().toString());log.info(student.getCard().getCardNum());for (String tel : student.getTels()) {log.info(tel);}student.getScore().forEach((k,v) -> log.info(k + " : " + v));}}

Map的forEach()方法,遍历了getScore()返回的Map对象,并通过日志输出了每个键值对的内容。

运行结果:

5、复杂的值绑定
1)新建一个 Teacher 实体类
@Data
public class Teacher {private String name;private Integer age;}
2)在 student 实体类中新加一个字段
 // 集合里面有个对象private List<Teacher> teaches;

yml绑定:

# 绑定复杂类型(集合中包含对象)teaches:- name: Mr.qiuage: 21- name: Ms.zhiage: 22

这是一个 YAML 配置文件,其中 teaches 是一个复杂类型,包含了两个对象:Mr.qiuMs.zhi,它们都拥有 nameage 两个属性。

3)测试
 
@SpringBootTest
@Slf4j
class Ch03ApplicationTests {@Autowiredprivate Student student;@Testvoid contextLoads() {log.info(student.getStuId().toString());log.info(student.getStuName());log.info(student.getAge().toString());log.info(student.getCard().getCardNum());for (String tel : student.getTels()) {log.info(tel);}student.getScore().forEach((k,v) -> log.info(k + " : " + v));student.getTeaches().forEach( teach -> {log.info(teach.getName());log.info(teach.getAge().toString());});}}

 运行结果:

 

四、值绑定和松散绑定到优点和缺点

YAML 数据绑定的值绑定和松散绑定有以下优点:

  1. 简单易读:YAML 格式的数据配置文件相对于传统的属性文件更加简洁易读,且支持注释和多行文本。
  2. 灵活性:YAML 的灵活性允许我们在配置文件中使用复杂的数据类型,包括数组、对象、嵌套对象等。
  3. 易于维护:通过将配置文件中的值绑定到 Java 类上,我们可以使用 Java 对象的语法来访问这些值,使得代码更加易于维护和阅读。
  4. 配置管理:通过 @ConfigurationProperties 注解,可以将应用程序的配置信息与业务逻辑分离,使得配置文件更加清晰易读,同时也方便进行统一的配置管理。

但是,YAML 数据绑定的值绑定和松散绑定也有以下缺点:

  1. 学习成本:相比于传统的属性文件,使用 YAML 格式的数据配置文件需要学习新的语法和规则,需要一些时间来适应。
  2. 错误处理:由于 YAML 的松散绑定特性,当配置文件中出现错误时,可能会造成不可预知的结果,需要开发者自己注意检查和处理。
  3. 性能问题:相比于传统的属性文件,使用 YAML 格式的数据配置文件解析和读取速度可能会稍慢一些,特别是在处理大量数据时。

综上所述,在使用 YAML 数据绑定时,需要根据具体情况权衡其优缺点,并选择适合自己的方式来处理配置信息。

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

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

相关文章

基于文心一言AI大模型,编写一段python3程序以获取华为分布式块存储REST接口的实时数据

本文尝试基于文心一言AI大模型&#xff0c;编写一段python3程序以获取华为分布式块存储REST接口的实时数据。 一、用文心一言AI大模型将需求转化为样例代码 1、第一次对话&#xff1a;“python3写一段从rest服务器获取数据的样例代码” 同时生成了以下注解 这段代码首先定义…

单链表(数据结构与算法)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

Flutter “No implementation found for method xxxx on channel

由于没有在setstate内更新UI 导致出现missplugin 添加setState后内部处理逻辑解决 setState(() {xxx逻辑 });

chatGPT2:如何构建一个可以回答有关您网站问题的 AI 嵌入(embeddings)

感觉这个目前没有什么用&#xff0c;因为客户可以直接问通用chatGPT&#xff0c;实时了解你网站内的信息&#xff0c;除非你的网站chatGPT无法访问。 不过自动预订、买票等用嵌入还是挺有用的。 什么是嵌入&#xff1f; OpenAI的嵌入&#xff08;embeddings&#xff09;是一种…

口袋参谋:只用一招,提前规避差评!请看具体操作步骤

​如何提前规避差评&#xff1f;至少99%的商家都不知道该怎么做&#xff0c;剩下的1%还是我刚教会的。 宝贝的评价直接影响宝贝转化&#xff0c;特别是新品链接。 10个好评也挽回不了一个差评对产品的致命打击&#xff0c;差评就像一个重磅炸弹&#xff0c;威力足够能让你的转…

TypeScript 学习笔记

【视频链接】尚硅谷TypeScript教程&#xff08;李立超老师TS新课&#xff09; TypeScript 1. 类型1.1 | 联合类型1.2 字面量类型1.3 any 任意类型1.4 unkown 类型1.5 as 类型断言1.6 object 对象类型1.7 { } 对象类型1.8 &#xff1f; 对象中的可选属性1.9 对象中的任意属性1.1…

RabbitMQ安装说明

注意: 本次安装以 CentOS 7为例 1、 准备软件 erlang 18.3 1.el7.centos.x86_64.rpm socat 1.7.3.2 5.el7.lux.x86_64.rpm rabbitmq server 3.6.5 1.noarch.rpm 2、安装Erlang rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm 3.、安装RabbitMQ 安装 rpm -ivh socat-1.7.3.2-…

2.4G无线收发芯片 XL2400P使用手册

XL2400P 系列芯片是工作在 2.400~2.483GHz 世界通用 ISM 频段的单片无线收发芯片。该芯片集成射 频收发机、频率收生器、晶体振荡器、调制解调器等功能模块&#xff0c;并且支持一对多组网和带 ACK 的通信模 式。发射输出功率、工作频道以及通信数据率均可配置。芯片已将多颗外…

PHP 循环控制 学习资料

PHP 循环控制 在 PHP 中&#xff0c;循环控制语句用于控制循环的执行流程&#xff0c;包括跳出循环、跳过当前迭代等操作。以下是 PHP 中常用的循环控制语句的介绍和示例&#xff1a; break 语句 break 语句用于立即跳出当前循环&#xff0c;并继续执行循环之后的代码。 示…

深眸科技以自研算法+先进硬件,创新打造AI视觉一体化解决方案

工业视觉软硬件一体化解决方案&#xff1a;是以工业AI视觉技术为核心&#xff0c;通过集成工业相机等视觉硬件、电控系统和机械系统等自动化设备以及算法平台等软件应用&#xff0c;为工业自动化降本增效提质。 深眸科技为进一步巩固和加强技术领先优势&#xff0c;创新打造的…

【精选】构建智能木材计数系统:深度学习与OpenCV完美结合(详细教程+源码)

1.研究背景与意义 随着科技的不断发展&#xff0c;计算机视觉技术在各个领域中得到了广泛的应用。其中&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;作为一种强大的深度学习模型&#xff0c;已经在图像识别、目标检测、人脸识…

鸿蒙原生应用/元服务开发-AGC分发如何编译打包应用

软件包规范 在正式打包应用前&#xff0c;请确保已了解HarmonyOS应用软件包规范。 操作步骤 1.打开DevEco Studio&#xff0c;菜单选择“Build > Build Hap(s)/APP(s) > Build APP(s)”。 2.等待编译构建。编译完成后&#xff0c;将在工程目录“build > outputs >…

vr编辑器可以解决教育教学中的哪些问题

VR编辑器是一种基于虚拟现实技术的教育内容编辑器&#xff0c;可以帮助教师快速创建出高质量的虚拟现实教学内容。 比如在畜牧教学类&#xff0c;通过这个软件&#xff0c;教师可以将真实的动物场景、行为和特征模拟到虚拟现实环境中&#xff0c;让学生在沉浸式的体验中学习动物…

D-Wave推出新开源及解决无线信道解码新方案!

​&#xff08;图片来源&#xff1a;网络&#xff09; 加拿大量子计算机公司D-Wave&#xff08;纽约证券交易所股票代码&#xff1a;QBTS&#xff09;是量子计算系统、软件和服务领域的佼佼者&#xff0c;也是全球首家商业量子计算机供应商。 近期&#xff0c;该公司发布了一…

LangChain: 类似 Flask/FastAPI 之于 Django,LangServe 就是「LangChain 自己的 FastAPI」

原文&#xff1a;LangChain: 类似 Flask/FastAPI 之于 Django&#xff0c;LangServe 就是「LangChain 自己的 FastAPI」 - 知乎 说明&#xff1a;LangServe代替 langchainserver 成为新的langchain 部署工具 官网资料&#xff1a;&#x1f99c;️&#x1f3d3; LangServe | &…

【SpringBoot】ThreadLocal 的详解

一、ThreadLocal 简介 ThreadLocal 叫做线程变量&#xff0c;意思是 ThreadLocal 中填充的变量属于当前线程&#xff0c;该变量对其他线程而言是隔离的&#xff0c;也就是说该变量是当前线程独有的变量。ThreadLocal 为变量在每个线程中都创建了一个副本&#xff0c;那么每个线…

企业如何选择一款高效的ETL工具

企业如何选择一款高效的ETL工具? 在企业发展至一定规模后&#xff0c;构建数据仓库&#xff08;Data Warehouse&#xff09;和商业智能&#xff08;BI&#xff09;系统成为重要举措。在这个过程中&#xff0c;选择一款易于使用且功能强大的ETL平台至关重要&#xff0c;因为数…

Android:Google三方库之Firebase集成详细步骤(一)

前提条件 安装最新版本的 Android Studio&#xff0c;或更新为最新版本。使用您的 Google 账号登录 Firebase请注意&#xff0c;依赖于 Google Play 服务的 Firebase SDK 要求设备或模拟器上必须安装 Google Play 服务 将Firebase添加到应用&#xff1a; 方式&#xff1a;使用…

智慧工地综合管理平台-环境监测子系统概要设计说明书

需求说明 原始背景 由于城市建设和工业化进程的加速,工地施工过程中的部分环节由于监管不到位,导致工地扬尘污染问题日益严重,对人类健康和环境质量造成了不可忽视的影响。为了解决这一问题,政府部门和相关企业逐渐意识到了建立工地扬尘监测系统的必要性和紧迫性,因此,环…

js 获取地址栏参数 封装方法

下面是一个 JavaScript 函数&#xff0c;用于获取 URL 中的参数并以对象形式返回&#xff1a; //获取地址栏参数(返回对象)function getUrlParams() {var urlParams {};var queryString window.location.search;if (queryString) {queryString queryString.replace(/^\?/,…