伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

mica cglib 增强——[1]cglib bean copy 介绍

来源:本站原创 浏览:133次 时间:2022-10-14
专栏目录

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

Cglib BeanCopier 介绍

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

性能

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




更多请见:https://github.com/yangtu222/BeanUtils#performance


图中可以看出,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;}






















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'


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




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


Cglib copy 问题

•不支持链式 bean。•不支持 原始类型和封装类型 copy int <-> Integer。•类型转换不够智能,设置 useConverter 为 true 和重写 Converter,类型相同也会走转换的逻辑。


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net