本文聊一个工具类,MapStruct ,它是一个在 dto,po(do/entity),vo 等这些 pojo 中转换字段的一个工具,在应用中经常有这样的转换,在 spring 和 apache-commons 中也有 BeanUtils 复制,但不够灵活,我之前也用反射写过一个字段复制,这种复制一般来是是很大量的,用反射会使系统的性能降低,有一种更高效的办法就是使用字节码工具类生成这些代码,这时在编译期就把代码弄好了,并且出错也好调试。
除了 MapStruct ,类似的工具还有
- Spring 的 BeanUtils ,apachecommons 的 BeanUtils
- Dozer - Mapper that copies data from one object to another using annotations and API or XML configuration.
- JMapper - Uses byte code manipulation for lightning-fast mapping. Supports annotations and API or XML configuration.
- ModelMapper - Intelligent object mapping library that automatically maps objects to each other.
- Orika - JavaBean-mapping framework that recursively copies (among other capabilities) data from one object to another.
- Selma - Annotation processor-based bean mapper.
我们的实际需求一般长这样子
- 同名字段同类型需要直接复制,不同类型要能转换
- 不同字段名同含义需要能转换
- 有时候需要有一些字段是不能复制的,比如 id
- 合并两个对象成一个对象,或者使用一个对象更新一个对象
- 性能要高,因为这个量比较大
所以首先就排除 spring 和 apache 的 BeanUtils 了,它们使用反射,并且不能排除字段,而且不同名不能复制,同名同类型还出错,超级难用
然后就是下面几种框架的性能对比 ,对比详情见 这篇文章
从性能>易用性>易调试>流行度 来说,我选择使用 Mapstruct
MapStruct 使用方法
MapStruct 使用起来也是比较简单的,引入两个包,加个接口转换,由于它是字节码转换方式,会自动给你生成字节码,你也可以直接查看的,使用方式网上文章很多,这里随便贴一篇
MapStruct 工具包的使用 更多使用细节自行百度或查官网 MapStruct 官网
MapStruct 原理
MapStruct 使用了 SPI 形式加载处理注解的类 MappingProcessor
,关于 SPI 见 这篇文章
ServiceLoader 的源码也不复杂,就是我们熟知的 Class.forName 搞的,感觉没多少原理可讲
然后给接口使用字节码工具类生成实现类,然后实现类里面就是各种判空和 get set
可以配合 lombok 生成 get set ,基本上重复代码都让编译器去写了。
文尾:最初我也是不太喜欢这种形式,看到注解都盖楼了,但用了一下之后发现,真香
一点小推广
创作不易,希望可以支持下我的开源软件,及我的小工具,欢迎来 gitee 点星,fork ,提 bug 。
Excel 通用导入导出,支持 Excel 公式
博客地址:https://blog.csdn.net/sanri1993/article/details/100601578
gitee:https://gitee.com/sanri/sanri-excel-poi
使用模板代码 ,从数据库生成代码 ,及一些项目中经常可以用到的小工具
博客地址:https://blog.csdn.net/sanri1993/article/details/98664034
gitee:https://gitee.com/sanri/sanri-tools-maven