【Java Bean 映射器】通过 MapStruct 和 BeanUtils 拷贝对象的区别

目录

👋前言

👀一、环境准备

🌱二、拷贝工具使用

        2.1 BeanUtils 使用

        2.2 MapStruct 使用

💞️三、对比

📫四、章末


👋前言

        小伙伴们大家好,最近在一些技术文章中看到了开发时经常接触的对象拷贝操作,实现该操作的话有很多方式,来探讨下常见的对象拷贝工具:MapStruct 和 Apache Commons BeanUtils

有哪些使用差异和哪些特性

👀一、环境准备

        为了方便对比每种拷贝工具的使用,先创建好几个基础类

        TestData.class 填充数据类,代码如下:

import lombok.Data;@Data
public class TestData {private Integer id;public TestData(int i){this.id = i;}
}

        Source.class 代表源数据类,代码如下:

import lombok.Data;/*** @author HuangBen */
@Data
public class Source {private Integer id;private String name;private TestData data;private Long createTime;
}

        Target.class 代表目标数据类,代码如下: 

@Data
public class Target {private Long id;private String name;private TestData data;private Long createTime;
}

🌱二、拷贝工具使用

        2.1 BeanUtils 使用

        BeanUtils 的使用比较简单,如下,先创建一个填充对象 testData(用于测试拷贝中涉及到的对象拷贝是深拷贝还是浅拷贝) ,然后创建源数据类,以及一个空的 target 对象,通过 BeanUtils.copyProperties(Source.class,Target.class) 方法将源数据类中的属性赋值给目标类对象:

        拷贝后的结果如下,可以看到目标类中 Long 类型的 id 与源数据 Integer 类型的 id 拷贝出现 null 值,另外对于 testData 的拷贝属于浅拷贝类型:

注:浅拷贝简单来讲就是拷贝出来的对象依然指向原有对象的引用地址,所以两者 == 操作的时候返回 true,并且修改原有对象会一并影响拷贝对象

        深拷贝出来的对象与原先对象没有联系,== 操作为 false,并且修改原有对象不会影响拷贝出来的对象

         2.2 MapStruct 使用

                2.2.1 mapStruct 是一个外部工具需要在 pom.xml 文件中手动导入依赖(版本可替换)

        <dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.2.0.Final</version></dependency>

                2.2.2 定义工具接口

                这里注意 @Mapper 注解的来源是 mapstruct 包下,不是 mybatis 的注解

                另外一个方法就是自定义的对象拷贝方法,从 Source 转换为 Target ,使用方式如下,该方式不需要提前创建对象,因为转换方法有返回值

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;/*** @author HuangBen */
@Mapper
public interface BeanMapper {BeanMapper INSTANCE = Mappers.getMapper(BeanMapper.class);Target map(Source source);}

 

        拷贝结果如下,可以看到从 Integer 类型转换为 long 类型的时候,mapstruct 会自动进行类型转换处理,并且默认也是浅拷贝:

               

                 2.2.3  MapStruct 不同类型转换成功分析

                测试类编译后我们可以在target目录下找到帮我们生成的一个接口实现类BeanMapperImpl,如下:

                在默认提供的实现类中会对不同类型的元素进行手动转换(前提支持这种类型转换)

 

💞️三、对比

BeanUtilsMapStruct
作用域属于运行时的工具库,使用反射机制动态地操作 Java Bean 的属性,存在性能开销基于编译时注解处理器的工具,在编译阶段生成映射代码,因此映射过程是类型安全的,并且在运行时性能较高。
性能使用反射机制来进行属性复制,运行时性能比 MapStruct 略低在编译时生成的代码(像编译后生成的默认实现类中存在指定的业务代码),因此性能较高,映射过程效率优秀。
依赖可直接使用,实现简单需要手动添加依赖引入,定义额外的处理过程

 

📫四、章末

        文中这种使用方式只是简单的对象拷贝操作,更多功能可以参考官方文档

        文章到这里就结束了~

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

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

相关文章

面向对象·回顾;万类之祖object;抽象类Abstract。

回顾面向对象 类与对象 类--------&#xff08;instance实例化对象&#xff09;-------->对象 类图 调出你public方法–接口 访问控制符 常用private&#xff0c;public。 封装 可见性本类包不同包private✓✕✕不写dafalt(默认)✓✓✕protected✓✓继承✓public✓✓✓…

【计算机网络】RIP路由协议实验

一&#xff1a;实验目的 1&#xff1a;掌握在路由器上配置RIPv2。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。具体为&#xff1a;三层交换机1台、路由器2台。 软件&#xff1a;wireshark软件、记…

01-调试开发k8s

使用 Docker 构建 Kubernete 官方 release 是使用 Docker 容器构建的。要使用 Docker 构建 Kubernetes&#xff0c;请遵循以下说明: Requirements docker Key scripts 以下脚本位于 build/ 目录中。请注意&#xff0c;所有脚本都必须从 Kubernetes 根目录运行 build/run.…

【科研绘图】记录一次论文结果复现

复现原论文中的图片是科研的基本功之一&#xff0c;它不仅验证了研究结果的可靠性&#xff0c;确保了科学工作的准确性和可重复性&#xff0c;还深刻地评估了方法的有效性&#xff0c;体现了对原始研究的尊重和对科学过程的严谨态度。这个过程不仅提高了研究的透明度&#xff0…

记忆注意力用于多模态情感计算!

记忆注意力用于多模态情感计算&#xff01; 目录 情感计算 一、概述 二、研究背景 三、模型结构和代码 六、数据集介绍 七、性能展示 八、复现过程 九、运行过程 模型总结 本文所涉及所有资源均在传知代码平台可获取。 情感计算 近年来&#xff0c;社交媒体的快速扩张推动了用户…

信通院发布!首个大模型混合云标准

近日&#xff0c;中国信通院发布了首个大模型混合云标准&#xff0c;通过定位当前大模型混合云的能力水平&#xff0c;为基于混合云的大模型服务实践提供指引&#xff0c;并明确未来提升方向。同时&#xff0c;中国信通院基于标准展开大模型混合云能力成熟度专项测试&#xff0…

智能家居全在手机端进行控制,未来已来!

未来触手可及&#xff1a;智能家居&#xff0c;手机端的全控时代 艾斯视觉的观点是&#xff1a;在不远的将来&#xff0c;家&#xff0c;这个温馨的港湾&#xff0c;将不再只是我们休憩的场所&#xff0c;而是科技与智慧的结晶。想象一下&#xff0c;只需轻触手机屏幕&#xf…

VMware 上的 Debian Linux 虚拟机无法听到蓝牙耳机的声音解决方案

项目场景&#xff1a; 在Debian上安装QQ音乐&#xff0c;用来摸鱼 问题描述 在安装完QQ音乐后&#xff0c;发现虚拟机无法听到声音&#xff0c;音乐有在正常播放&#xff0c;但是蓝牙耳机没有听到任何声音&#xff1a; 原因分析&#xff1a; 感觉是虚拟机的声卡没有配置&…

WiFi通信——STM32通过ESP8266-01S与阿里云通信

嵌入式设计中常用的无线通信方式主要由蓝牙、WiFi、Zigbee、Lora、NB-IOT等等。这些是最常用的&#xff0c;也是在实际项目开发中根据项目的数据通信特点来选择相应的无线通信方式。本设计主要是讲解WiFi在嵌入式开发中的使用。 1.ESP8266的三种模式 1.1 STA模式(Station) 工…

FPGA开发——独立仿真和联合仿真

一、概述 我们在进行FPGA开发的过程之中&#xff0c;大部分情况下都是在进行仿真&#xff0c;从而验证代码实现结果的正确与否&#xff0c;这里我们引入了独立仿真和联合仿真进行一个简单介绍。 联合仿真&#xff1a;一般我们在进行仿真之前需要在相应的软件中建立相应的工程…

昇思25天学习打卡营第01天|昇思MindSpore大模型基础j介绍

昇思MindSpore和华为昇思MindSpore大模型学习打卡系列文章&#xff0c;本文仅供参考~ 文章目录 前言一、昇思MindSpore是什么&#xff1f;二、执行流程三、设计理念四、层次结构五、Huawei昇腾AI全栈 前言 随着计算机大模型的不断发展&#xff0c;Ai这门技术也越来越重要&#…

【LeetCode 随笔】C++入门级,详细解答加注释,持续更新中。。。

文章目录 58.【简单】最后一个单词的长度&#x1f31f; &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻&#xff0c;都…

使用vfbox网关实现modbus opc profinet iec61850等协议间的转换

在当今物联网&#xff08;IoT&#xff09;与工业自动化日益融合的时代背景下&#xff0c;协议转换网关作为连接不同设备与系统之间的桥梁&#xff0c;扮演着至关重要的角色。VFBox协议转换网关&#xff0c;作为这一领域内的佼佼者&#xff0c;以其高效、灵活、可靠的性能&#…

学习周报:文献阅读+HEC RAS案例

目录 摘要 Abstract 文献阅读&#xff1a;通过HEC RAS软件为罗马尼亚布加勒斯特市的Dmbovița河水管理的水力模型 文献摘要 讨论|结论 理论知识 边界条件计算 流量计算方式 曼宁公式 (Mannings Equation) 连续性方程 (Continuity Equation) 能量方程 (Energy Equatio…

API资源对象CRD、认识Operator-理论知识和认识Operator-初次上手(2024-07-17)

一、API资源对象CRD Kubernetes 自定义资源定义&#xff08;Custom Resource Definition&#xff0c;简称 CRD&#xff09;是一种强大的 Kubernetes API 扩展机制&#xff0c;允许你定义和创建自己的资源类型&#xff0c;以满足您的应用程序或基础设施需求。 CRD 的核心思想是…

LeetCode 2766题: 重新放置石块(原创)

【题目描述】 给你一个下标从 0 开始的整数数组 nums &#xff0c;表示一些石块的初始位置。再给你两个长度 相等 下标从 0 开始的整数数组 moveFrom 和 moveTo 。 在 moveFrom.length 次操作内&#xff0c;你可以改变石块的位置。在第 i 次操作中&#xff0c;你将位置在 moveF…

基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码

第一步&#xff1a;准备数据 5种鸟类行为数据&#xff1a;self.class_indict ["bowing_status", "grooming", "headdown", "vigilance_status", "walking"] &#xff0c;总共有23790张图片&#xff0c;每个文件夹单独放一…

从零搭建pytorch模型教程(八)实践部分(二)目标检测数据集格式转换

前言 图像目标检测领域有一个非常著名的数据集叫做COCO&#xff0c;基本上现在在目标检测领域发论文&#xff0c;COCO是不可能绕过的Benchmark。因此许多的开源目标检测算法框架都会支持解析COCO数据集格式。通过将其他数据集格式转换成COCO格式可以无痛的使用这些开源框架来训…

【计算机网络】静态路由实验

一&#xff1a;实验目的 1&#xff1a;掌握通过静态路由方法实现网络的连通性。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS-C服务器、网线、Windows 2019/2003操作系统的计算机等。 软件&#xff1a;记事本、WireShark、Chrome浏览器等。 三&#xff1a;实验方…

《分析模式:可重用对象模型》学习笔记之四:企业财务分析中的观察和测量02

这个模型基本解决问题&#xff0c;可以方便定义层次&#xff0c;以及反映了三个不同的维数元素&#xff0c;也反映了企业部门单元和维数元素的关系&#xff0c;但是很快可以看到&#xff0c;在这里&#xff0c;维数被局限在三个&#xff1a;也就是说&#xff0c;如果维数需要改…