MapStruct是一个代码生成器,它基于约定优于配置方法极大地简化了Java bean类型之间映射的实现。
生成的映射代码使用普通方法调用,因此快速,类型安全且易于理解。
如何接入MapStruct
IDEA Support: https://plugins.jetbrains.com/plugin/10036-mapstruct-support/versions
Java Bean属性拷贝对比
- 性能
get/set >= [MapStruct](http://mapstruct.org/) > [JMapper](https://jmapper-framework.github.io/jmapper-core/) > ["beanCopier(cglib)"](https://github.com/cglib/cglib/blob/master/cglib/src/main/java/net/sf/cglib/beans/BeanCopier.java) > Orika > ModelMapper > Spring BeanUtils > Dozer > Apache BeanUtils
-
性能对比数据来源:
- https://www.baeldung.com/java-performance-mapping-frameworks
- https://java.libhunt.com/categories/337-bean-mapping
-
对比结果:
- get/set 需要手动编写大量转换代码,代码简洁性差、重复性高和工作量大。
- beanCopier 性能较高,属性名和类型有较高的匹配要求。
- MapStruct 性能较高,在编译阶段,生成Get/Set代码,支持不同属性之间自定义转换。
- Orika 性能较高,支持自定义属性拷贝,性能略差与前两种,但比后面几种高很多。属性名相同单类型不同事需编写转换规则,否则会报错
- Spring BeanUtils 性能一般,只能支持相关名称的拷贝。
- Dozer 性能差,使用简单,编写xml不方便。
- Apache BeanUtils 性能差。
demo
实例代码:
/**
* 定义对象之间转换Mapper
* @Mapper 只有在接口加上这个注解, MapStruct 才会去实现该接口
* @Mapper
* componentModel :主要是指定实现类的类型,
* - default:默认,可以通过 Mappers.getMapper(Class) 方式获取实例对象
* - spring:在接口的实现类上自动添加注解 @Component,可通过 @Autowired 方式注入
* uses 使用用户自定义转换器
*
* http://mapstruct.org/documentation/stable/reference/html/
*/
//@Mapper(componentModel = "spring",uses = {DateHandWritten.class})
@Mapper(
uses = {
DateHandWritten.class, UserNameHandWritten.class},
imports = {
LocalDateUtil.class}
)
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
@Mappings(