带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(8)

简介: 带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(8)

带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(7)https://developer.aliyun.com/article/1339757?groupCode=taobaotech


探究引入顺序

 

本文在第一章提到,引入MapStruct时,必须要注意Lombok包与MapStruct包的顺序,关于这一点,网上很少有  相关文章提及。

 

问题来源

 

在复现《告别BeanUtils,Mapstruct入门到精通》代码时,文中提到的引入顺序是这样的:

 

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>

 

 

实践发现,在一个空工程中,如果按照上述写法引入MapStruct,其并不能正常工作。

 

而当修改引入顺序为以下方案时,则MapStruct可以正常使用。

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.0.Final</version>
</dependency>

 

进一步测试发现,只有mapstruct-processor包在lombok包下面时,MapStruct才能够正常使用。

 

MapStruct基本原理

 

为了探究上述问题产生的原因,我们首先要理解MapStruct的基本原理。

 

MapStruct与其他Bean映射库最大的不同就是,其在编译期间生成转换代码,而不是在运行时通过反射生成代 码。

 

为了更直观的理解这一点,可以从target中找到MapStruct自动生成的对应的ConveterImpl类,如下图所示:

image.png

 

 

 

即MapStruct为我们编写的Convert抽象类自动生成了一个实现。

而Lombok也是在编译时自动生成代码,那么问题大概率就出现在这里了。

 

带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(9)https://developer.aliyun.com/article/1339755?groupCode=taobaotech

相关文章
|
前端开发 JavaScript
JavaScript快捷方式:15个简写技巧,让你的代码事半功倍!
JavaScript快捷方式:15个简写技巧,让你的代码事半功倍!
IDEA 使用 lombak 时的一个小警告:Generating equals/hashCode implementation but without a call to superclass
今日在IDEA中使用Lombok时遇到@Data注解的黄色警告,提示equals和hashCode未调用父类方法。虽不影响运行,但影响美观。可通过@EqualsAndHashCode(callSuper = true)或在lombok.config中配置默认行为解决,推荐后者统一管理,彻底消除警告。
|
2月前
|
前端开发
Promise的then方法返回的新Promise对象有什么特点?
Promise的then方法返回的新Promise对象有什么特点?
436 2
|
传感器 数据采集 存储
以下是一个简化的环境监测系统工程概述,并附带有Python代码示例或详解。
以下是一个简化的环境监测系统工程概述,并附带有Python代码示例或详解。
|
12月前
|
JavaScript
可自由配置的jQuery消息提示框插件toast
jquery.toast.js是一款可自由配置的jQuery消息提示框插件。该消息提示框可以自定义背景和前景色,提示框的位置,提示框的显示时间,提示框的动画效果等。
370 2
|
机器学习/深度学习 人工智能 TensorFlow
利用Python和TensorFlow实现简单图像识别
【8月更文挑战第31天】在这篇文章中,我们将一起踏上一段探索人工智能世界的奇妙之旅。正如甘地所言:“你必须成为你希望在世界上看到的改变。” 通过实践,我们不仅将学习如何使用Python和TensorFlow构建一个简单的图像识别模型,而且还将探索如何通过这个模型理解世界。文章以通俗易懂的方式,逐步引导读者从基础到高级,体验从编码到识别的整个过程,让每个人都能在AI的世界中看到自己的倒影。
|
机器学习/深度学习 数据采集 算法
经典机器学习算法——Pagerank算法(一)
PageRank 算法由 Google 创始人 Larry Page 在斯坦福读大学时提出,又称 PR——佩奇排名。主要针对网页进行排名,计算网站的重要性,优化搜索引擎的搜索结果。PR 值是表示其重要性的因子
经典机器学习算法——Pagerank算法(一)
|
JavaScript
vue + element UI 表单中内嵌自定义组件的表单校验触发方案
vue + element UI 表单中内嵌自定义组件的表单校验触发方案
480 5
|
安全 网络协议 算法
电脑病毒木马的清除和防范方法
电脑病毒木马的清除和防范方法
2858 0
电脑病毒木马的清除和防范方法
|
缓存 Linux
centos内存检测工具
【6月更文挑战第1天】centos内存检测工具
400 3