• Bean 字段复制利器 MapStruct


    本文聊一个工具类,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

  • 相关阅读:
    测试签名和验证签名
    自定义mssql的CLR函数
    关于C#的Process的内存相关属性解读
    测试C#发送邮件
    关于wmv视频格式
    练习命名管道的使用
    web中局部滚动条
    C#修改文件的安全属性时报“没有可以设置的标志”
    c#的FileSystemWatcher对象监视文件的变化的事件,无休止的触发事件的解决办法
    为什么要给自己设限?
  • 原文地址:https://www.cnblogs.com/sanri1993/p/12048116.html
Copyright © 2020-2023  润新知