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 互轉加強和總結。java

Cglib BeanCopier 介紹

阿里巴巴 p3c 插件中有這麼一項檢查 「避免用Apache Beanutils進行屬性的copy,Apache BeanUtils性能較差,能夠使用其餘方案好比Spring BeanUtils, Cglib BeanCopier」。今天咱們的主角主要就是 Cglib 的 BeanCopier。git

性能

下圖是 github 上的一個 Bean copy 性能的對比,能夠看出 Bean copy 工具性能差距仍是比較大。github


圖片



更多請見:https://github.com/yangtu222/BeanUtils#performanceweb


圖中能夠看出,Cglib BeanCopier 的性能十分強勁,也難怪阿里巴巴規範中也推薦,下面咱們來看看它具體的使用方式。spring

使用

Cglib 以源碼的形式歸入到 Spring core 中,全部你們使用 Spring、Spring boot 能夠直接使用。其它則須要本身添加依賴,下面的使用例子都以 Spring 的爲主。注意:使用了 Lombok 。ide

User 對象







@Datapublic class User {   private Integer id;   private String name;   private Integer age;}

UserVo 對象






@Datapublic 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 字節碼技術。下面咱們來看看生成的代碼。工具

在 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 方法。咱們能夠看到控制檯打印下了這麼一行日誌。idea


CGLIB debugging enabled, writing to '/Users/lcm/git/mica/mica-example/web-example/src/test/java'


下面咱們來看看生成的代碼:spa


圖片



看到此圖你們恍然大悟,Cglib BeanCopier 幫咱們生成了 get set 轉換。


Cglib copy 問題

不支持鏈式 bean。不支持 原始類型和封裝類型 copy int <-> Integer類型轉換不夠智能,設置 useConverter 爲 true 和重寫 Converter,類型相同也會走轉換的邏輯。

相關文章
相關標籤/搜索