带你读《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类,如下图所示:
即MapStruct为我们编写的Convert抽象类自动生成了一个实现。
而Lombok也是在编译时自动生成代码,那么问题大概率就出现在这里了。
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(9)https://developer.aliyun.com/article/1339755?groupCode=taobaotech