天天看点

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>也会走转换的逻辑。