BeanCopier几种框架的比较对比,你熟悉哪种?
项目中的通常都会遇到bean copy的场景,spring,oracle,Apache都有自己的开源bean copy框架,大家常常会困扰到底哪个框架的性能最好,下面对各个框架的性能测试,帮助大家在开发中使用合适自己的bean copy框架:
常用的对象属性的拷贝方式有很多,就随便说几个:
spring 的 BeanUtils.copyproperties() 原理:反射
apache的 BeanUtils.copyproperties()
String的 BeanUtils.copyproperties()
PropertyUtils.copyproperties()
BeanCopier.create()原理:cglib 利用字节码技术
但是上面几个中,我测试了spring的 BeanUtils.copyproperties() 发现的确很慢,BeanCopier.create()的最快,及什么都不用原始的setXXX重新赋值的3种情况。
测试环境:
测试工具:jmeter
线程数:10
并发时间:1秒内启动10个线程
结束时间:1分钟
第一种:原始的setXXX,主要看Average平均时间
第二种:spring的BeanUtils.copyproperties
第三种:cglib-BeanCopier.create(), 高版本的spring中已经封装了,拿来用就行了
BeanCopier.create()的使用方式:
BeanCopier copier = BeanCopier.create(AddessResolverDto.class, RespFullDcDto.class, false);
copier.copy(bullSortingDto, respFullDcDto,null);
————————————————
结论:
直接用get,set是最快的,如果实例字段比较少的情况下,建议直接使用get,set。
cglib在没有converter的情况下性能是最好的,如果有converter的话要具体看converter的实现,总体速度也是很快的,建议不需要或简单converter场景的使用。
Spring beanUtils 和orika在并发低情况下速度相当,当线程增加以及字段量增加的时候,orika性能逐渐有优势(orika对于21属性和41属性速度差不多,而spring beanUtils由于是基于反射实现,属性增加耗时也相应增加)。orika劣势在于需要初始化Factory,每个类转换都需要注册到factory,使用起来比较繁琐,orika优势在于字段量大,并发高的场景,并且orika是深拷贝可以自己定义转换字段,所以推荐在需要的情况使用。
Apache的相对比较慢,不建议使用。
推荐大家使用cglib和orika