BeanCopier性能对比
概述
常见或常用的几种Bean属性复制工具
- Apache.BeanUtils
- Apache.PropertyUtil
- Spring.BeanUtils
- Cglib.BeanCopier
- MapStruct
- EZMorph
使用场景:Dto与Entity转换
- 普通属性复制
- 个别属性过滤
- 属性类型转换
- 数组或集合拷贝
性能对比
测试在两个简单的Bean之间转换的耗时,执行次数分别为10、100、1k、10k、100k,时间单位为ms。
源码分析
Apache.BeanUtils
org.apache.commons.beanutils
- 通过内省(Introspector)获取源类型的属性信息
- 判断源类型的属性是否可读及目标类型的属性是否可写
- 可读
- 有getter方法
- 可写
- 有setter方法
- 可读
- 进行复制
- 获取属性名
- 获取属性类型
- 进行属性值转类型[自带类型转换器,提供注册自定义转换器接口]
- 赋值
执行过程
- 获取工具实例,调用属性复制方法
- 获取实例方法
- 实例获取的函数是同步的,因为ContextClassLoader的不同,每个线程都会创建一个实例
- 属性复制函数:先是空值的判断,然后通过Java内省机制获取属性描述,判断属性是否可读/可写,然后通过反射赋值
发现在初始化过程中,BeanUtils实例的获取是“假单例”模式,每个线程拥有一个BeanUtils实例,所以每个线程每次初始化都消耗资源。
Apache.PropertyUtils
org.apache.comons.beanutils
使用内省,操作getter/setter方法。基本流程同Apache.BeanUtils
区别
BeanUtils支持属性类型转换,而PropertyUtils不支持,若有同名不同类型的属性,则会报错。
BeanUtils自带类型转换器,支持如下类型转换:
- java.lang.BigDecimal
- java.lang.BigInteger
- boolean and java.lang.Boolean
- byte and java.lang.Byte
- char and java.lang.Character
- java.lang.Class
- double and java.lang.Double
- float and java.lang.Float
- int and java.lang.Integer
- long and java.lang.Long
- short and java.lang.Short
- java.lang.String
- java.sql.Date
- java.sql.Time
- java.sql.Timestamp
Springframework.beans.BeanUtils
org.springframework.beans.BeanUtils
Spring的BeanUtils也是通过java内省机制获取getter/setter,然后通过反射调用从而实现属性复制,但区别于Apache的BeanUtils,Spring的BeanUtils为单例模式,不需要重复创建。同时,Spring.BeanUtils支持忽略属性。
Cglib BeanCopier
net.sf.cglib.beans
使用动态代理,生成字节码类,再通过Java反射成Class,调用其copy方法。
执行过程
创建BeanCopier
[使用了缓存,该过程也消耗资源,建议全局只初始化一次]
通过字节码生成了两个类
- KeyFactory
- BeanCopier
调用copy方法。
(支持自定义类型转换器)【有convert的情况】
【无convert的情况】
生成的BeanCopier里面直接使用Bean的setter/getter
MapStruct
org.mapstrcut.*
http://mapstruct.org/
支持XML配置和注解配置
使用示例
- 自定义Mapper类
- 编译生成实现类
- Bean复制
EZMorph
性能感人,不做深究。
也是通过反射
功能维度对比
根据属性复制工具的功能维度对工具进行分析,对比如下:
- Apache.BeanUtils
- Apache.PropertyUtil
- Spring.BeanUtils
- Cglib.BeanCopier
- MapStruct
- EZMorph
总结
根据不同工具的性能及功能维度,个人建议当对象转换操作较少或者应用对性能要求较高时,尽量不采用工具,而是手写getter/setter;在不考虑性能的情况下,普通的对象转换可以使用Cglib.BeanCopier,复杂的对象转换使用MapStruct。
BeanCopier性能对比相关推荐
- java bean 优缺点_Java Bean Copy框架性能对比
一.问题分析 背景 相同server机器上的相同方法在方法调用链任何参数都一致的情况消耗时间差别非常大,举例说明,类A有方法demo(), 通过分析发现同一台机器(也是一个jvm进程)对该方法的两次调 ...
- Java常用消息队列原理介绍及性能对比
消息队列使用场景 为什么会需要消息队列(MQ)? 解耦 在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一 ...
- golang连接postgresql too many client_MySQL和PostgreSQL压测性能对比
阅读使人充实,讨论使人敏捷,写作使人精确. >>> 压测业务场景文章属于互联网社区动态类场景核心功能压测案例.至于题目涉及的MySQL和PostgreSQL之间的关系,主要为业务选型 ...
- php下curl与file_get_contents性能对比
为什么80%的码农都做不了架构师?>>> 上一篇讲了 <php使用curl替代file_get_contents>, 后续贴出了curl和file_get_cont ...
- p40与p100训练性能对比
深度学习训练,选择P100就对了 原文:https://yq.aliyun.com/articles/238764 摘要: 本文使用NVCaffe.MXNet.TensorFlow三个主流开源深度学习 ...
- php vs lua,解析LUA与PHP在WEB应用的性能对比
解析LUA与PHP在WEB应用的性能对比是本文要介绍的内容,这几天用在WEB开发的LUA框架已经完成,框架中已包括数据库操作和模板操作的功能,能够很简单方便的应用在WEB开发上.在此时我对这个LUA框 ...
- Jetson Nano and VIM3硬件参数对比及目标检测性能对比
文章目录: 1 Jetson Nano and VIM3硬件参数对比及目标检测性能对比 2 Jetson nano在yolov4目标检测性能 3 VIM在yolov3.yolov3-tiny.yolo ...
- MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比
1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...
- cimage和gdi绘图效率比较_GDI+和GDI绘图性能对比实验
龙源期刊网 http://www.qikan.com.cn GDI+ 和 GDI 绘图性能对比实验 作者:王克茹 来源:<科技创新与应用> 2013 年第 25 期 摘 要:本文通过完全相 ...
最新文章
- springboot初学
- 《现代教育技术》Win8版发布 项目总结
- java.math.BigDecimal保留两位小数,保留小数,精确位数
- mybatis缓存机制
- ubuntu安装/查看已安装包的方法
- ide 日志 乱码_IDE日志分析方法pt。 1个
- 使用Gradle引导旧式Ant构建
- System V IPC之信号灯
- c语言 画线函数,c语言绘制函数曲线
- mac hosts文件已锁定无法修改怎么办?hosts修改权限设置教程
- 关于PHP在企业级开发领域的访谈——企业级开发,PHP准备好了吗?
- 【技术框架汇总】_开发平台_前端框架_手机端框架_测试工具_数据库中间件_监控工具_框架_汇总
- linux面试基础考题
- 线程---同步---快乐影院小案例
- ​云队友丨两次疫情冲击,却两次成功上市,携程是怎么做到的?
- 一种高效查找树-radix的实现
- 栈内存与堆内存的简单理解
- FastReport for Delphi
- Word处理控件Aspose.Words功能演示:使用 Java 将 Word 文档转换为 Markdown
- 法国内政部选择IDEMIA和Sopra Steria为其开发新标准边境管制系统