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

news2024/9/20 22:44:10

目录

👋前言

👀一、环境准备

🌱二、拷贝工具使用

        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.coloradmin.cn/o/1952609.html

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

相关文章

小论文写不出来?一文告别没思路!SCI级新算法闪耀登场,完整代码及应用直接获取

最近稍微有点忙&#xff0c;事情比较多&#xff0c;构思灵感花费了不少时间。这次发布的算法和前几个基于数学基本思想开发的算法不一样&#xff0c;是一种基于动物的一种算法&#xff0c;从动物的本能和行为中汲取灵感。本算法的开发&#xff0c;灵感撰写以及完整的算法已经全…

【“微软蓝屏”事件暴露了网络安全哪些问题?】建设安全稳固的网络基础设施

目录 前言一、软件更新流程中的风险管理和质量控制机制&#xff08;一&#xff09;测试流程及风险识别&#xff08;二&#xff09;风险管理策略&#xff08;三&#xff09;质量控制措施 二、预防类似大规模故障的最佳方案或应急响应对策&#xff08;一&#xff09;冗余系统设计…

0722_驱动1 字符设备驱动框架

一、字符设备驱动框架 字符设备驱动按照字节流进行访问&#xff0c;并且只能顺序访问 设备号一共有32位&#xff0c;主设备号&#xff08;高12位&#xff09;次设备号&#xff08;低20位&#xff09; 二、注册/注销字符设备驱动API接口 2.1、注册字符设备驱动(入口) #include &…

小白学习webgis的详细路线

推荐打开boss直聘搜索相关岗位&#xff0c;查看岗位要求&#xff0c;对症下药是最快的。 第一阶段&#xff1a;基础知识准备 计算机基础 操作系统&#xff1a;理解Windows、Linux或macOS等操作系统的基本操作&#xff0c;学会使用命令行界面。网络基础&#xff1a;掌握TCP/I…

【netty系列-05】深入理解直接内存与零拷贝

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

谷歌再被OpenAI截胡?训练数学AI拿下IMO银牌,不及SearchGPT放了空响..

昨夜谷歌振臂高呼&#xff1a;我们新的数学AI&#xff0c;能在IMO数学竞赛达到银牌水平&#xff01; 但就在谷歌发文的几个小时后&#xff0c;OpenAI就偷了谷歌的家&#xff1a; 发布新的搜索方式SearchGPT &#xff0c;剑指挑战谷歌的搜索引擎。 谷歌双模型并用攻克数学难题…

如何利用业余时间做副业,在家里赚钱,来增加收入

人一生每个阶段都会有压力和烦恼&#xff0c;中年人更是如此。 上有老下有小&#xff0c;生活的重担都在一个人身上&#xff0c;压得人喘不过气&#xff0c;这些都需要钱&#xff0c;仅靠工资已经很难维持一家人的开支了。 所以很多人打算利用业余时间做副业&#xff0c;来增加…

为什么多数大数据治理项目都是失败的?Gartner调查失败率超过90%

引言&#xff1a;随着数据规模的爆发式增长、数据价值的凸显以及数据治理的必要性。在政策的推动、市场需求的拉动以及技术进步的支撑下&#xff0c;大数据治理正成为推动企业数字化转型、提升数据价值的重要手段。企业希望通过大数据治理提升数据利用率和数据价值&#xff0c;…

学习记录——day17 数据结构 队列 链式队列

队列介绍 1、队列也是操作受限的线性表:所有操作只能在端点处进行&#xff0c;其删除和插入必须在不同端进行 2、允许插入操作的一端称为队尾&#xff0c;允许删除操作的一端称为队头 3、特点:先进先出(FIFO) 4、分类&#xff1a; 顺序存储的栈称为顺序栈 链式存储的队列&a…

免费【2024】springboot 成都奥科厨具厂产品在线销售系统设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

将手机作为服务器运行docker服务

前言 目前手机的配置并不低&#xff0c;即使是2019年生产的一加七Pro&#xff0c;配置也有12256&#xff0c;CPU是骁龙855&#xff0c;作为服务器运行着配置绰绰有余了&#xff0c;二手的价格现在是400左右也能接受。相对于是自带ups电源的便携低耗docker服务器&#xff0c;还…

C++ unordered_map与unordered_set的模拟实现

目录 0.前言 1.哈希表&#xff08;HashTable&#xff09;设计 1.1设计思想 1.2 HashTable.h 1.3设计思路 2.unordered_map封装 2.1 UnorderedMap.h 2.2代码解释 2.3测试函数 3.unordered_set封装 3.1 UnorderedSet.h 3.2代码解释 3.3测试函数 4.结语 &#xff08;图像由AI生成&…

项目打包与运行

前端运行时必须有与后端相同的数据库版本&#xff0c;数据库账号密码 右侧maven -> 展开要打包的项目 -> 生命周期 -> 双击package 打包好之后在target目录下 右键打开 在资源目录下输入cmd&#xff0c;执行以下命令即可运行&#xff08;端口号为yml文件…

人流量为王:背后的赚钱密码深度解析

在当今商业世界中&#xff0c;“人流量为王”这一理念被广泛认可和奉行。但你是否认真思考过&#xff0c;这简单的四个字背后&#xff0c;究竟隐藏着怎样复杂而精妙的赚钱逻辑&#xff1f; 一、人流量意味着潜在客户的聚集 想象一下繁华的商业街&#xff0c;熙熙攘攘的人群穿梭…

7月26日JavaSE学习笔记

反射 Java是面向对象的&#xff0c;有对象必须先有类&#xff0c; 有static修饰类的属性和方法&#xff1b;在Java中存储了类的内容&#xff0c;这个内容也应该是一个对象&#xff1b;Java中每一个用到的类都会加载一块内存&#xff0c;这每一块内存都是一个对象&#xff1b;这…

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

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

EB Tresos 基于S32K3芯片 ICU模块实现gpio外部中断配置[后续更新实现icu模块的其他功能]

环境&#xff1a;eb tresos 27.0.1 port 模块配置&#xff1a; 选择一个具有erq功能的引脚并配置为erq功能。如下我选择的是 PTB0 -EIRQ[8] - SIUL2_EXT_IRQ_8_15_ISR Platform 模块配置 在这个模块中配置中断的开关以及中断句柄 ICU模块配置 具体配置参考博客&#xff1a;…

【python】python大学排名数据抓取+可视化(源码+数据集+可视化+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

深度强化学习 ②(DRL)

参考视频&#xff1a;&#x1f4fa;王树森教授深度强化学习 前言&#xff1a; 最近在学习深度强化学习&#xff0c;学的一知半解&#x1f622;&#x1f622;&#x1f622;&#xff0c;这是我的笔记&#xff0c;欢迎和我一起学习交流~ 这篇博客目前还相对比较乱&#xff0c;后面…

黑马Java零基础视频教程精华部分_5_面向对象综合练习

系列文章目录 文章目录 系列文章目录一、文字版格斗游戏二、文字版格斗游戏进阶版三、对象数组练习1、对象数组1先学习一下键盘录入。注意&#xff1a;两套体系不能混用 对象数组2对象数组3对象数组4对象数组5 一、文字版格斗游戏 GameTes.javat代码如下&#xff1a; package …