本套专栏主要是介绍微服务核心框架 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
扫描上面二维码,更多精彩内容天天推荐!