天天看點

mica cglib 增強——[1]cglib bean copy 介紹

•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 工具性能差距還是比較大。

mica cglib 增強——[1]cglib 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 &lt;-&gt; Integer</code>。•類型轉換不夠智能,設定 useConverter 為 true 和重寫 Converter,<code>類型相同</code>也會走轉換的邏輯。