大家好,又见面了,我是你们的朋友全栈君。
常见或常用的几种Bean属性复制工具
使用场景:Dto与Entity转换
测试在两个简单的Bean之间转换的耗时,执行次数分别为10、100、1k、10k、100k,时间单位为ms。
org.apache.commons.beanutils
执行过程
发现在初始化过程中,BeanUtils实例的获取是“假单例”模式,每个线程拥有一个BeanUtils实例,所以每个线程每次初始化都消耗资源。
org.apache.comons.beanutils
使用内省,操作getter/setter方法。基本流程同Apache.BeanUtils
区别
BeanUtils支持属性类型转换,而PropertyUtils不支持,若有同名不同类型的属性,则会报错。
BeanUtils自带类型转换器,支持如下类型转换:
org.springframework.beans.BeanUtils
Spring的BeanUtils也是通过java内省机制获取getter/setter,然后通过反射调用从而实现属性复制,但区别于Apache的BeanUtils,Spring的BeanUtils为单例模式,不需要重复创建。同时,Spring.BeanUtils支持忽略属性。
net.sf.cglib.beans
使用动态代理,生成字节码类,再通过Java反射成Class,调用其copy方法。
执行过程
[使用了缓存,该过程也消耗资源,建议全局只初始化一次]
通过字节码生成了两个类
(支持自定义类型转换器) 【有convert的情况】
【无convert的情况】
生成的BeanCopier里面直接使用Bean的setter/getter
org.mapstrcut.*
http://mapstruct.org/ 支持XML配置和注解配置
使用示例
性能感人,不做深究。
也是通过反射
根据属性复制工具的功能维度对工具进行分析,对比如下:
根据不同工具的性能及功能维度,个人建议当对象转换操作较少或者应用对性能要求较高时,尽量不采用工具,而是手写getter/setter;在不考虑性能的情况下,普通的对象转换可以使用Cglib.BeanCopier,复杂的对象转换使用MapStruct。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。