概述:
官方:MapStruct 是一个 Java 注释处理器,用于生成类型安全的 Bean 映射类。
我方:MapStruct是一款对象转换工具,主要是用于实体对象 VO
、BO
、DTO
、DO
等等之间的转换,作用类似于BeanUtils。相同类似的Bean映射工具有Dozer、Orika、ModelMapper、JMapper 等,如下是相关介绍
https://cloud.tencent.com/developer/article/1624695
Why?
为啥使用mapstruct?
性能
下面我们通过循环执行对象属性复制次数,分别测试set/get、Apache BeanUtils、Spring BeanUtils、Cglib BeanCopier、MapStruct等执行方法,看看它们所消耗的时间如何,统计报表明细如下!
从图中我们可以得出如下结论!
1.set/get方式操作最简单,性能最强,当之无愧 number one!但是机械式编程工作比较多。
2.MapStruct方式性能其次,主要的优势在于编译期间生成set/get代码,但是操作不够灵活,如果需要复制的目标对象很多,需要定义多个接口或者方法。
3.Cglib BeanCopier和Spring BeanUtils,虽然两者使用的技术方案各有不同,在实际的测试过程中,100 万数据量以下的循环复制操作差异并不明显,编程方面比较明显的区别是BeanCopier比BeanUtils稍微多一行代码,日常使用中,两者都可以,根据自己的喜好选择即可。
4.Apache BeanUtils和Spring BeanUtils,两者的底层都是基于类反射进行属性复制,不同的地方在于Apache BeanUtils加了过多的包装,使用了很多反射,做了很多校验,导致性能大大削弱了,同时Spring BeanUtils内部使用了缓存,加快了转换的速度,因此如果要二选一,推荐采用Spring BeanUtils工具。
应用
争对结构简单的Bean字段少的对象映射,用spring自带或者hutool工具一般是够用了,但是应对复杂的应用场景这些工具就力不从心了。
两个bean之间的复制,字段名字差异很大但是需要属性赋值
两个bean结构复杂,内嵌其他bean和list
一个目标bean的数据源是多个bean时
数据源是map结构时
在service层需要写大量无关逻辑的bean转换
字段的变更需要查找对应逻辑,改涉及多个地方的字段修改
等等
争对上面的这些问题,mapstruct足以应付,在对接第三方接口的数据源和多个领域模型之间转换游刃有余~
举个简单的例子
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car {
private String make;
private int numberOfSeats;
private String type;
private int price;
private BigDecimal power;
private Date manufacturingDate;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CarDto {
private String manufacturer;
private int seatCount;
private String type;
private String price;
private String power;
private String time;
}
car->catdto用mapstruct的方式,清晰对应字段关系如果需要自定义字段的数据获取方式也可以,这里不展开。
@Mapping(target = "manufacturer", source = "make")
@Mapping(target = "seatCount", source = "numberOfSeats")
@Mapping(target = "price", source = "price", numberFormat = "$#.00")
@Mapping(target = "power",source = "power", numberFormat = "#.##E0")
@Mapping(target = "time",source = "manufacturingDate", dateFormat = "HH:mm:ss dd.MM.yyyy")
CarDto carToCarDto(Car car);
如果要用BeanUtil.copy这就失去了意义,得get/set写大量代码维护
我觉得官方文档非常详细,如下可以参考参考
中文文档:https://www.mapstruct.plus/mapstruct/1-5-5-Final.html
MapStructPlus文档:https://www.mapstruct.plus/introduction/quick-start.html
Mapstruct Plus 是 Mapstruct 的增强工具,在 Mapstruct 的基础上,实现了自动生成 Mapper 接口的功能,并强化了部分功能,使 Java 类型转换更加便捷、优雅。
MapStruct文档:https://mapstruct.org/documentation/1.5/reference/html/#introduction
评论区