本套專欄主要是介紹微服務核心框架 Mica 中對 Cglib bean copy 的一系列加強,保證高性能的同時,提升易用性。整個專欄有 6 篇文章,感興趣的朋友請加關注。vue
阿里巴巴 p3c 插件中有這麼一項檢查 「避免用Apache Beanutils進行屬性的copy,Apache BeanUtils性能較差,能夠使用其餘方案好比Spring BeanUtils, Cglib BeanCopier」。今天咱們的主角主要就是 Cglib 的 BeanCopier。java
下圖是 github 上的一個 Bean copy 性能的對比,能夠看出 Bean copy 工具性能差距仍是比較大。git
更多請見:https://github.com/yangtu222/BeanUtils#performancegithub
圖中能夠看出,Cglib BeanCopier 的性能十分強勁,也難怪阿里巴巴規範中也推薦,下面咱們來看看它具體的使用方式。web
Cglib 以源碼的形式歸入到 Spring core 中,全部你們使用 Spring、Spring boot 能夠直接使用。其它則須要本身添加依賴,下面的使用例子都以 Spring 的爲主。注意:使用了 Lombok
。spring
@Data public class User { private Integer id; private String name; private Integer age; }
@Data public class UserVo { private String name; private Integer age; }
import org.springframework.cglib.beans.BeanCopier; public class UserCopyTest { public static void main(String[] args) { // 1. 初始化 user,賦值 User user = new User(); user.setId(250); user.setName("如夢技術"); user.setAge(30); // 2. 初始化 userVo UserVo userVo = new UserVo(); // 3. 構造 BeanCopier,不是用類型轉換 BeanCopier copier = BeanCopier.create(User.class, UserVo.class, false); // 4. 拷貝對象,不是用類型轉換,轉換器能夠使用 null copier.copy(user, userVo, null); // 5. 打印結果:UserVo(name=如夢技術, age=30) System.out.println(userVo); } }
你們都知道 Cglib BeanCopier,之因此性能這麼高主要是利用了 Asm 字節碼技術。mybatis
在 UserCopyTest 的 main 方法中添加下面的代碼(建議直接放置到 1. 初始化 user,賦值 以前),指定cglib 源碼生成目錄,建議生成到 idea 項目中,能夠直接打開生成的 class 字節碼。架構
// 設置 cglib 源碼生成目錄 String sourcePath = "/Users/lcm/git/mica/mica-example/web-example/src/test/java"; System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, sourcePath);
再次執行 main 方法。咱們能夠看到控制檯打印下了這麼一行日誌。框架
CGLIB debugging enabled, writing to '/Users/lcm/git/mica/mica-example/web-example/src/test/java'
下面咱們來看看生成的代碼:ide
看到此圖你們恍然大悟,Cglib BeanCopier 幫咱們生成了 get set 轉換。
int <-> Integer
。類型相同
也會走轉換的邏輯。注意:這部分後面會詳細介紹,喜歡的朋友請關注、訂閱咱們。
mica:https://github.com/lets-mica/mica
如夢技術官網:https://www.dreamlu.net
mica
工具集:https://gitee.com/596392912/mica Avue
一款基於vue可配置化的神奇框架:https://gitee.com/smallweigit/avue pig
宇宙最強微服務(架構師必備):https://gitee.com/log4j/pig SpringBlade
完整的線上解決方案(企業開發必備):https://gitee.com/smallc/SpringBlade IJPay
支付SDK讓支付觸手可及:https://gitee.com/javen205/IJPay
掃描上面二維碼,更多精彩內容天天推薦!