Bean 字段复制利器 MapStruct

本文聊一个工具类,MapStruct ,它是一个在 dto,po(do/entity),vo 等这些 pojo 中转换字段的一个工具,在应用中经常有这样的转换,在 spring 和 apache-commons 中也有 BeanUtils 复制,但不够灵活,我之前也用反射写过一个字段复制,这种复制一般来是是很大量的,用反射会使系统的性能降低,有一种更高效的办法就是使用字节码工具类生成这些代码,这时在编译期就把代码弄好了,并且出错也好调试。

除了 MapStruct ,类似的工具还有

  • Spring 的 BeanUtils ,apachecommons 的 BeanUtils
  • Dozer – Mapper that copies data from one object to another using annotations and API or XML configuration.

  • JMapper – Uses byte code manipulation for lightning-fast mapping. Supports annotations and API or XML configuration.

  • ModelMapper – Intelligent object mapping library that automatically maps objects to each other.

  • Orika – JavaBean-mapping framework that recursively copies (among other capabilities) data from one object to another.

  • Selma – Annotation processor-based bean mapper.

我们的实际需求一般长这样子

  • 同名字段同类型需要直接复制,不同类型要能转换
  • 不同字段名同含义需要能转换
  • 有时候需要有一些字段是不能复制的,比如 id
  • 合并两个对象成一个对象,或者使用一个对象更新一个对象
  • 性能要高,因为这个量比较大

所以首先就排除 spring 和 apache 的 BeanUtils 了,它们使用反射,并且不能排除字段,而且不同名不能复制,同名同类型还出错,超级难用

从性能>易用性>易调试>流行度 来说,我选择使用 Mapstruct

MapStruct 使用方法

MapStruct 使用起来也是比较简单的,引入两个包,加个接口转换,由于它是字节码转换方式,会自动给你生成字节码,你也可以直接查看的,使用方式网上文章很多,这里随便贴一篇

MapStruct 原理

ServiceLoader 的源码也不复杂,就是我们熟知的 Class.forName 搞的,感觉没多少原理可讲

然后给接口使用字节码工具类生成实现类,然后实现类里面就是各种判空和 get set

可以配合 lombok 生成 get set ,基本上重复代码都让编译器去写了。

文尾:最初我也是不太喜欢这种形式,看到注解都盖楼了,但用了一下之后发现,真香

一点小推广

创作不易,希望可以支持下我的开源软件,及我的小工具,欢迎来 gitee 点星,fork ,提 bug 。

Original: https://www.cnblogs.com/sanri1993/p/12048116.html
Author: sanri1993
Title: Bean 字段复制利器 MapStruct

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/569595/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 练习阅读新闻

    从小到大对新闻不敏感,直到现在复试面试时,老师可能会问到最近的一些热点新闻,才开始关注。可以这么说,我对于世界的认识,还停留在高中的历史课……可见我多么迂腐…

    Java 2023年6月5日
    082
  • Netty源码解读(三)-NioEventLoop

    先看看EventLoop类图 我们在Netty第二篇文章中的代码中,看到有多次用到eventLoop.execute()方法,这个方法就是EventLoop开启线程执行任务的关键,…

    Java 2023年6月16日
    097
  • 分享一款好玩的工具

    闲着无聊,想看看电视剧,可惜像我这么懒的人是不会冲会员的,也无法忍受某酷那些网站的广告的毒害,然后我还懒得为了看个电视剧去各个网站找视频,麻烦呀 记得之前分享过一个直接复制那些收费…

    Java 2023年6月6日
    094
  • .Net Core3.1上用EFCore的反向工程生成

    反向工程-EF Core | Microsoft Docs 原文:https://www.cnblogs.com/qidakang/p/11302327.html 一、简要步骤 1…

    Java 2023年5月29日
    072
  • 记一次线上服务器301异常 httpclient的坑

    一、场景复现 营运车应用在登录过程中需要调用用户中心认证的接口来完成统一登录,因为云服务器升级对请求限制https only,在登录过程中出现系统异常(server error服务…

    Java 2023年6月13日
    097
  • MongoDB高级应用之高可用方案实战(4)

    1、MongDB启动与关闭 1.1、命令行启动 ./mongod –fork –dbpath=/opt/mongodb/data —-logpath=/opt/mongod…

    Java 2023年6月7日
    085
  • .Net MVC实现角色-API权限验证的一种方式

    阅文时长 | 1.15分钟字数统计 | 1844.8字符主要内容 | 1、引言&背景 2、部分设计分享 3、声明与参考资料『.Net MVC实现角色-API权限验证的一种方…

    Java 2023年6月5日
    0114
  • maven工程servlet实例之导入项目依赖jar包

    maven工程servlet实例之导入项目依赖jar包 添加 jar 包的坐标时,还可以指定这个 jar 包将来的作用范围。每个 maven 工程都需要定义本工程的坐标,坐标是 m…

    Java 2023年6月6日
    091
  • 使用Dom4j、反射自定义实现xml与java对象互转

    一、前言国庆假期临近,工作动力不强。所以写几篇之前项目中自己用到的一些可能有用的东西分享出来。今天分享的是Xml与javaBean互转的自定义实现。先说几种我知道的Xml与java…

    Java 2023年6月14日
    089
  • 深入MySQL(三):MySQL的索引的应用

    在MySQL的优化中,索引的作用绝对算是一个大头,很多时候索引使用得当可以使得一个查询的效率提高几个数量级,同时它还具有自动排序等功能。所以如果是深入MySQL,那么索引绝对是其中…

    Java 2023年6月7日
    070
  • MySQL十八:写语句的执行过程

    转载~ 当我们需要修改一个记录时,数据库会先根据条件找到要修改的数据,然后执行修改写入操作,因此我们再分析写操作的执行过程时,其实是包含读语句的执行过程的。 一、读语句的执行过程 …

    Java 2023年6月8日
    087
  • Linux 下的vim工具

    Vim/Vi简介Vim/Vi是一个功能强 大的全屏幕文本编辑器,是LinuxUNIX上最常用的文本编辑器,它的作用是立、编辑、显示文本文件。VimMi没有菜单,只有命令 Origi…

    Java 2023年6月7日
    073
  • 程序员的10个好习惯

    我总结了 10 个程序员的好习惯,今天分享给大家。 1. 引入新的技术栈的时候,要以官方文档为主 在项目里,无论使用新的 jar 包,还是用新的中间件,一定要去看官方文档。 现在网…

    Java 2023年6月7日
    080
  • web 网页nginx反向代理【检查到弱密码套件:不支持完全向前保密 】处理

    web 项目扫描出如下问题: 处理方式如下: 打开nginx配置文件nginx.conf,添加如下内容: python;gutter:true;ssl_ciphers ‘AES12…

    Java 2023年5月30日
    077
  • redis启动报无权限

    设置一下SELINUX 关闭SElinux 查看selinux状态 [root@localhost ~]# getenforce Enforcing 表示启动 临时关闭 [root…

    Java 2023年6月9日
    072
  • springboot访问静态文件直接通过url

    application.yml 加入: spring: thymeleaf: prefix: classpath:/templates/ suffix: .html mode: H…

    Java 2023年5月30日
    052
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球