本文聊一個工具類,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