Bean 拷貝在工做中被大量使用,能夠大幅度的減小工做量。本文對經常使用的 Bean copy 工具進行了壓力測試,方便你們選擇更加適合本身的工具。本篇文章是《mica cglib 加強——【01】cglib bean copy 介紹》續篇,該專欄會持續更新,感興趣的朋友請關注咱們。java
•MapStruct (編譯期生成 Mapper 實現)[1]•Selma (編譯期生成 Mapper 實現)[2]•yangtu222 - BeanUtils (第一次生成 copy 實現字節碼)[3]•mica (第一次生成 copy 實現字節碼)[4]•hutool (反射)[5]spring
/** * 來源用戶 * * @author L.cm */@Datapublic class FormUser { private Long id; private String nickName; private Integer age; private String phone; private String email; private String password; private Integer gender; private String avatar;}
/** * 轉換的用戶 * * @author L.cm */@Datapublic class ToUser { private String nickName; private String phone; private String email; private Integer gender; private String avatar;}
/** * 附帶類型轉換的 用戶模型 * * @author L.cm */@Data@Accessors(chain = true)public class FormConvertUser { private Long id; private String nickName; private Integer age; private String phone; private String email; private String password; private Integer gender; private String avatar; @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME) private LocalDateTime birthday;}
/** * 附帶類型轉換的 用戶模型 * * @author L.cm */@Data@Accessors(chain = true)public class ToConvertUser { private String nickName; private Integer age; private String phone; private String email; private String password; private Integer gender; private String avatar; private String birthday;}
•OS: macOS Mojave•CPU: 2.8 GHz Intel Core i5•RAM: 8 GB 1600 MHz DDR3•JVM: Oracle 1.8.0_201 64 bitsapp
Benchmark | Score | Error | Units |
hutool | 1939.092 | 26.747 | ops/ms |
spring | 3569.035 | 39.607 | ops/ms |
cglib | 9112.785 | 560.503 | ops/ms |
mica | 17753.409 | 393.245 | ops/ms |
yangtu222 | 18201.997 | 119.189 | ops/ms |
cglibMapper | 37679.510 | 3544.624 | ops/ms |
mapStruct | 50328.045 | 529.707 | ops/ms |
selma | 200859.561 | 2370.531 | ops/ms |
Benchmark | Score | Error | Units |
mica | 1186.375 | 64.686 | ops/ms |
mapStruct | 1623.478 | 13.894 | ops/ms |
selma | 160020.595 | 2570.747 | ops/ms |
Benchmark | Score | Error | Units |
spring | 35.974 | 0.555 | ops/ms |
mica | 169.066 | 5.460 | ops/ms |
Benchmark | Score | Error | Units |
hutool | 1338.551 | 16.746 | ops/ms |
mica | 13577.056 | 27.795 | ops/ms |
和 java-object-mapper-benchmark[6] 測試結果有些出入。ide
Selma 的表現反而比 MapStruct 更好,多是模型不同致使的。工具
工具包 | 須要編寫Mapper | 支持Map | 支持List、Set | 類型轉換 | 性能 |
Selma | 是 | 否 | 否 | 須要手寫轉換 | 超高 |
MapStruct | 是 | 否 | 否 | 支持經常使用類型和複雜表達式 | 高 |
BeanUtils(yangtu222) | 否 | 否 | 是 | 須要手寫轉換 | 高 |
mica | 否 | 是 | 是 | 基於 Spring 的類型轉換 | 高 |
Spring | 否 | 否 | 否 | 不支持 | 中 |
hutool | 否 | 是 | 否 | 不支持 | 中 |