带你读《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

相关文章
|
安全
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(4)
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(4)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(4)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(4)
106 0
|
SQL 缓存 JSON
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(1)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(1)
159 1
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(5)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(5)
109 1
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(6)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(6)
|
算法
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(3)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(3)
|
网络协议
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(2)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(2)
131 1
|
安全
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(3)
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(3)
|
缓存 JSON 前端开发
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(6)
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(6)