Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作
在Java编程中,BeanUtil工具类是一种强大且便捷的工具,用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能,通过详细的代码示例展示其应用,并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用场景,帮助开发者更好地理解和应用这一工具类。

一、BeanUtil 工具类介绍
1. BeanUtil 简述
BeanUtil是一个广泛使用的Java工具类,提供了一系列方法来简化JavaBean对象之间的属性复制和操作。它主要用于解决复杂的对象操作和属性处理问题,显著提高代码的可读性和维护性。
BeanUtils是浅拷贝,对基本数据类型进行值传递,对引用数据类型,使用其引用地址,不拷贝其内容。与之对应的是深拷贝,深拷贝是对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。
2. BeanUtil 功能
BeanUtil的核心功能包括:
- 属性复制:将一个对象的属性复制到另一个对象中。
- 属性设置和获取:动态地设置和获取对象的属性值。
- 类型转换:支持基本类型和包装类型之间的转换。
以下是BeanUtil的一些常用功能及其描述:
| 功能 | 描述 |
|---|---|
| copyProperties | 将一个对象的属性值复制到另一个对象中 |
| setProperty | 设置对象的指定属性值 |
| getProperty | 获取对象的指定属性值 |
| cloneBean | 克隆一个对象,生成其副本 |
| populate | 使用Map数据填充对象的属性 |
| describe | 将对象的属性和值转换为Map |
3. 与同类对象/属性操作库的对比
除了BeanUtil,还有许多类似的工具类和库可以实现对象属性复制和操作。
以下是一些常见的同类工具:
-
Apache Commons BeanUtils:
- 提供了一系列用于操作JavaBean的实用工具方法,包括属性复制、属性设置和获取等。它是一个开源库,广泛用于Java项目中。
-
Spring BeanUtils:
- 由Spring Framework提供的工具类,提供了简单的属性复制和操作方法。它在Spring应用程序中非常常见,特别适用于Spring生态系统内的项目。
-
Dozer:
- 一个Java Bean到Java Bean的映射器,支持深度复制和复杂的映射需求。它允许自定义映射配置,适用于需要进行复杂对象转换的场景。
-
ModelMapper:
- 一种智能的对象映射框架,旨在简化对象之间的映射。它提供了强大的映射功能,能够处理复杂的对象关系和类型转换。
-
MapStruct:
- 一种编译时代码生成器,自动生成类型安全、高性能的Bean映射代码。它通过注解驱动的方式定义映射关系,减少运行时的开销。
-
Orika:
- 一个Java Bean映射器,专注于提供快速且简单的对象映射功能。它支持复杂的映射配置和多种映射策略,适用于需要高性能映射的项目。
下表对这些工具类的主要功能进行对比:
| 工具类 | 属性复制 | 属性设置和获取 | 类型转换 | 性能 | 配置复杂度 |
|---|---|---|---|---|---|
| BeanUtil | 是 | 是 | 是 | 中等 | 低 |
| Apache BeanUtils | 是 | 是 | 是 | 低 | 低 |
| Spring BeanUtils | 是 | 是 | 否 | 高 | 低 |
| Dozer | 是 | 否 | 是 | 低 | 中等 |
| ModelMapper | 是 | 否 | 是 | 中等 | 中等 |
| MapStruct | 是 | 否 | 是 | 高 | 高 |
| Orika | 是 | 否 | 是 | 中等 | 中等 |
这些工具类和库各有特点,开发者可以根据项目需求选择最合适的工具。例如,Apache Commons BeanUtils和Spring BeanUtils适合简单的属性复制,而Dozer和ModelMapper则适合处理复杂的对象映射和转换需求。MapStruct和Orika则在性能和类型安全方面表现出色。
二、BeanUtil 工具类使用示例
1. 属性复制
属性复制是BeanUtil最常用的功能之一,可以将一个对象的所有属性值复制到另一个对象中。
+-------------------+ BeanUtil +-------------------+
| Source Object | -------------->| Target Object |
|-------------------| 复制属性 |-------------------|
| name: "John" | | name: "John" |
| age: 30 | | age: 30 |
+-------------------+ +-------------------+
以下是示例代码:
import org.apache.commons.beanutils.BeanUtils;public class BeanUtilExample {public static void main(String[] args) {try {SourceObject source = new SourceObject("John", 30);TargetObject target = new TargetObject();BeanUtils.copyProperties(target, source);System.out.println("Target Object: " + target);} catch (Exception e) {e.printStackTrace();}}
}class SourceObject {private String name;private int age;public SourceObject(String name, int age) {this.name = name;this.age = age;}// getters and setters
}class TargetObject {private String name;private int age;@Overridepublic String toString() {return "TargetObject [name=" + name + ", age=" + age + "]";}// getters and setters
}
在这个示例中,copyProperties方法将source对象的属性值复制到target对象中。
2. 属性设置和获取
BeanUtil还提供了动态设置和获取对象属性的方法。
以下是示例代码:
import org.apache.commons.beanutils.BeanUtils;public class PropertyExample {public static void main(String[] args) {try {MyBean myBean = new MyBean();BeanUtils.setProperty(myBean, "name", "Alice");BeanUtils.setProperty(myBean, "age", 25);String name = BeanUtils.getProperty(myBean, "name");String age = BeanUtils.getProperty(myBean, "age");System.out.println("Name: " + name);System.out.println("Age: " + age);} catch (Exception e) {e.printStackTrace();}}
}class MyBean {private String name;private int age;// getters and setters
}
3. 对象克隆
BeanUtil还可以克隆对象,生成其副本。
以下是示例代码:
import org.apache.commons.beanutils.BeanUtils;public class CloneExample {public static void main(String[] args) {try {MyBean original = new MyBean("Bob", 40);MyBean clone = (MyBean) BeanUtils.cloneBean(original);System.out.println("Original: " + original);System.out.println("Clone: " + clone);} catch (Exception e) {e.printStackTrace();}}
}class MyBean {private String name;private int age;public MyBean() {}public MyBean(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "MyBean [name=" + name + ", age=" + age + "]";}// getters and setters
}
在这个示例中,cloneBean方法创建了original对象的一个副本。
三、BeanUtil 工具类总结
BeanUtil工具类为Java开发者提供了一种简便的方法来操作JavaBean对象的属性。通过使用BeanUtil,开发者可以减少重复代码,提高开发效率,增强代码的可读性和可维护性。尽管有许多类似的工具类和库,BeanUtil凭借其简单易用和强大的功能,仍然是许多项目中的首选。选择合适的工具类应根据项目的具体需求和复杂度来决定。对于简单的属性复制和操作,BeanUtil无疑是一个优秀的选择。而对于复杂的映射需求,可能需要考虑使用其他更为强大的映射工具。希望本文通过详细的介绍和示例代码,能够帮助开发者更好地理解和应用BeanUtil工具类,提高开发效率和代码质量。

相关文章:
Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作
在Java编程中,BeanUtil工具类是一种强大且便捷的工具,用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能,通过详细的代码示例展示其应用,并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用…...
【ES6】ECMAS6新特性概览(一):变量声明let与const、箭头函数、模板字面量全面解析
🔥 个人主页:空白诗 🔥 热门专栏:【JavaScript】 文章目录 🌿 引言一、 let 和 const - 变量声明的新方式 🌟📌 var的问题回顾📌 let的革新📌 const的不变之美 二、 Arro…...
刷题之从前序遍历与中序遍历序列构造二叉树(leetcode)
从前序遍历与中序遍历序列构造二叉树 前序遍历:中左右 中序遍历:左中右 前序遍历的第一个数必定为根节点,再到中序遍历中找到该数,数的左边是左子树,右边是右子树,进行递归即可。 #include<vector>…...
微信小程序--微信开发者工具使用小技巧(3)
一、微信开发者工具使用小技巧 1、快速创建小程序页面 在app.json中的pages配置项,把需要创建的页面填写上去 2、快捷键使用 进入方式 1: 文件–>首选项–> keyboard shortcuts 进入快捷键查看与设置 进入方式 2: 设置–>快捷键…...
JDBC的 PreparedStatement 的用法和解释
文章目录 前言1、封装数据库连接和关闭操作数据库配置文件 config.properties 2、批量添加操作3、查询操作4、修改和删除操作总结 前言 PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 1、封装数据库连接和关闭操作 package org.springblade.m…...
LeetCode 面试150
最近准备面试,我以前不愿意面对的 现在保持一颗本心,就是专注于算法思想,语言基础的磨炼; 不为速成,不急功近利的想要比赛,或者为了面试。 单纯的本心,体验算法带来的快乐,是一件非常…...
xmake+xrepo自建仓库添加交叉编译工具链
xmakexrepo自建仓库添加交叉编译工具链 最近想将交叉编译工具链放到xrepo自建仓库中,在xmake中引用,方便多个电脑快速实现交叉编译。 xmake官方文档感觉不够详细,折腾了好久,这里做个记录。 基本步骤如下: 添加自建…...
论文阅读》学习了解自己:一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023
《论文阅读》学习了解自己:一个粗略到精细的个性化对话生成的人物感知训练框架 AAAI 2023 前言 简介研究现状任务定义模型架构Learning to know myselfLearning to avoid Misidentification损失函数实验结果消融实验 前言 亲身阅读感受分享,细节画图解释…...
[Java EE] 网络编程与通信原理(三):网络编程Socket套接字(TCP协议)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …...
MyBatis懒加载数据(大批量数据处理)
使用范例 Cursor约定使用Iterator去懒加载数据,以时间换空间,非常适合处理通常无法容纳在内存中的数百万个项目查询。如果在 resultMap 中使用集合,则必须使用 resultMap 的 id 列对游标 SQL 查询进行排序(resultOrdered“true”)。 //为了避…...
MySQL--联合索引应用细节应用规范
目录 一、索引覆盖 1.完全覆盖 2.部分覆盖 3.不覆盖索引-where条件不包含联合索引的最左则不覆盖 二、MySQL8.0在索引中的新特性 1.不可见索引 2.倒序索引 三、索引自优化--索引的索引 四、Change Buffer 五、优化器算法 1.查询优化器算法 2.设置算法 3.索引下推 …...
【spring boot+Lazy ORM+mysql】开发一个数据库管理系统实现对应数据库数据查看和修改
【spring bootLazy ORMmysql】开发一个数据库管理系统实现对应数据库数据查看和修改 演示项目地址:http://124.222.48.62:30193/wu-smart-acw-ui/index.html#/login (admin/admin) 功能 用户登录注册新增、编辑数实例新增、编辑数据库信息…...
知识分享:隔多久查询一次网贷大数据信用报告比较好?
随着互联网金融的快速发展,越来越多的人开始接触和使用网络贷款。而在这个过程中,网贷大数据信用报告成为了评估借款人信用状况的重要依据。那么,隔多久查询一次网贷大数据信用报告比较好呢?接下来随小易大数据平台小编去看看吧。 首先&…...
【Day8:JAVA字符串的学习】
目录 1、常用API2、String类2.1 String类的特点2.2 String类的常见构造方法2.3 String类的常见面试题:2.3.1 面试题一:2.3.2 面试题二:2.3.3 面试题三:2.3.4 面试题四: 2.4 String类字符串用于比较的方法2.5 String类字…...
jetcache缓存
1 介绍 是阿里的双极缓存,jvm-->redis-->数据库 文档:jetcache/docs/CN at master alibaba/jetcache GitHub 2 注意事项 使用的实体类一定实现序列化接口定时刷新注解,慎用 它会为每一个key创建一个定时器 :场景为&…...
SQLSyntaxErrorException: FUNCTION dbname.to_timestamp does not exist
由于MySQL数据库高版本(如8.x)中有to_timestamp()函数,低版本中(如5.7.x)没有这个函数,服务运行报错。 自己创建函数实现功能,创建语句如下; DELIMITER // CREATE FUN…...
Borel-Cantelli 引理
翻译自大佬 https://huarui1998.com/Notes/math/borel-cantelli.html 1. 集序列的 lim inf \lim\inf liminf 和 lim sup \lim\sup limsup 类似于定义实数序列 { a k } \{a_k\} {ak} 的 lim inf \lim\inf liminf 和 lim sup \lim\sup limsup, …...
算法训练营第四十一天 | LeetCode 509 斐波那契数列、LeetCode 70 爬楼梯、LeetCode 746 使用最小花费爬楼梯
LeetCode 509 斐波那契数列 这题动规五部曲都定义得比较明确。首先是dp数组下标,题目中给定F(0) 0说明从0开始,dp[i]直接表示F(i)的值即可。递推公式也直接给出了,也给了开头两个作为递推基础的数值作为初始化依据。遍历顺序也指明是从前往…...
网络其他重要协议(DNS、ICMP、NAT)
1.DNS DNS是一整套从域名映射到IP的系统 1.1 DNS背景 TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆,例如我们想访问百度就会在浏览器中输入baidu.com而不是百度的IP地址。于是人们发明了一种叫主机名的东西, 是…...
利用PyCSP3库(含大量全局约束)进行组合约束建模
文章目录 1. 什么是 PyCSP3 ?2. 安装方法(Windows)2.1 通过 Google_colab 直接运行2.2 通过 pip 进行安装3. 快速入门3.1 声明变量3.2 更新约束3.3 定义目标3.4 常用的全局约束1. 什么是 PyCSP3 ? PyCSP3 是 Python 中的一个库,用于对组合约束问题进行建模,包括 约束满足…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
