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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM