博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mica cglib 增强——[1]cglib bean copy 介绍
阅读量:6376 次
发布时间:2019-06-23

本文共 2364 字,大约阅读时间需要 7 分钟。

专栏介绍

本套专栏主要是介绍微服务核心框架 Mica 中对 Cglib bean copy 的一系列增强,保证高性能的同时,提高易用性。整个专栏有 6 篇文章,感兴趣的朋友请加关注。

专栏目录

  1. cglib bean copy 介绍。
  2. mica bean copy 介绍和链式 bean copy 的支持。
  3. mica bean 支持 copy 原始类型和封装类型。
  4. mica bean 支持 copy map 到 bean。
  5. 使用Spring的类型转换增强 mica bean copy。
  6. mica bean、Map 互转增强和总结。

Cglib BeanCopier 介绍

阿里巴巴 p3c 插件中有这么一项检查 “避免用Apache Beanutils进行属性的copy,Apache BeanUtils性能较差,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier”。今天我们的主角主要就是 Cglib 的 BeanCopier。

性能

下图是 github 上的一个 Bean copy 性能的对比,可以看出 Bean copy 工具性能差距还是比较大。

11111111.png

更多请见:

图中可以看出,Cglib BeanCopier 的性能十分强劲,也难怪阿里巴巴规范中也推荐,下面我们来看看它具体的使用方式。

使用

Cglib 以源码的形式纳入到 Spring core 中,所有大家使用 Spring、Spring boot 可以直接使用。其它则需要自己添加依赖,下面的使用例子都以 Spring 的为主。注意:使用了 Lombok

User 对象

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

UserVo 对象

@Datapublic class UserVo {    private String name;    private Integer age;}

Bean 拷贝

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 方法。我们可以看到控制台打印下了这么一行日志。

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

下面我们来看看生成的代码:

1111.png

看到此图大家恍然大悟,Cglib BeanCopier 帮我们生成了 get set 转换。

Cglib copy 问题

  1. 不支持链式 bean,mybatis-plus 生成的 Model 中默认添加了 @Accessors(chain = true) 注解默认为链式。
  2. 不支持 原始类型和封装类型 copy int <-> Integer
  3. 类型转换不够智能,设置 useConverter 为 true 和重写 Converter,类型相同也会走转换的逻辑。

注意:这部分后面会详细介绍,喜欢的朋友请关注、订阅我们。

链接

mica:

如梦技术官网:

开源推荐

  • Spring boot 微服务高效开发 mica 工具集:
  • Avue 一款基于vue可配置化的神奇框架:
  • pig 宇宙最强微服务(架构师必备):
  • SpringBlade 完整的线上解决方案(企业开发必备):
  • IJPay 支付SDK让支付触手可及:

转载地址:http://zinqa.baihongyu.com/

你可能感兴趣的文章
网曝支付宝漏洞:手机丢了,支付宝也就完了
查看>>
4 在vCenter Server安装View Composer组件
查看>>
SFB 项目经验-24-为持久聊天室-查询或者增加成员
查看>>
Linux下配置Squid基础教程
查看>>
当Cacti遭遇大流量
查看>>
Outlook Anywhere 客户端配置详解
查看>>
来,测一下你的学习能力!
查看>>
《Windows Server 2008 R2系统管理实战》前言与内容提要
查看>>
轻巧的网络流量实时监控工具NTOPNG
查看>>
MySQL的log_bin和sql_log_bin 到底有什么区别?
查看>>
Access、Sql 获取当前插入的主键ID
查看>>
聚类算法之DBScan(Java实现)
查看>>
为什么要使用AOP?
查看>>
iis7.0修改网站端口
查看>>
Vista下串口问题
查看>>
SYS_单据序列Sequence产生方式(案例)
查看>>
android2.2源码初探
查看>>
AMD OpenCL大学课程(11)
查看>>
康拓展开及应用
查看>>
VC :模板类
查看>>