•cglib bean copy 介紹。•mica bean copy 介紹和鍊式 bean copy 的支援。•mica bean 支援 copy 原始類型和封裝類型。•mica bean 支援 copy map 到 bean。•使用Spring的類型轉換增強 mica bean copy。•mica bean、Map 互轉增強和總結。
阿裡巴巴 p3c 插件中有這麼一項檢查 “避免用Apache Beanutils進行屬性的copy,Apache BeanUtils性能較差,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier”。今天我們的主角主要就是 Cglib 的 BeanCopier。
下圖是 github 上的一個 Bean copy 性能的對比,可以看出 Bean copy 工具性能差距還是比較大。

更多請見:https://github.com/yangtu222/BeanUtils#performance
圖中可以看出,Cglib BeanCopier 的性能十分強勁,也難怪阿裡巴巴規範中也推薦,下面我們來看看它具體的使用方式。
Cglib 以源碼的形式納入到 Spring core 中,所有大家使用 Spring、Spring boot 可以直接使用。其它則需要自己添加依賴,下面的使用例子都以 Spring 的為主。注意:使用了 <code>Lombok</code> 。
大家都知道 Cglib BeanCopier,之是以性能這麼高主要是利用了 Asm 位元組碼技術。下面我們來看看生成的代碼。
在 UserCopyTest 的 main 方法中添加下面的代碼(建議直接放置到 1. 初始化 user,指派 之前),指定cglib 源碼生成目錄,建議生成到 idea 項目中,可以直接打開生成的 class 位元組碼。
再次執行 main 方法。我們可以看到控制台列印下了這麼一行日志。
下面我們來看看生成的代碼:
看到此圖大家恍然大悟,Cglib BeanCopier 幫我們生成了 get set 轉換。
•不支援鍊式 bean。•不支援 原始類型和封裝類型 copy <code>int <-> Integer</code>。•類型轉換不夠智能,設定 useConverter 為 true 和重寫 Converter,<code>類型相同</code>也會走轉換的邏輯。