BeanCopier_contabo测评

BeanCopier_contabo测评概述常见或常用的几种Bean属性复制工具Apache.BeanUtilsApache.PropertyUtilSpring.BeanUtilsCglib.BeanCopierMapStructEZMorph使用场景:Dto与Entity转换普通属性复制个别属性过滤属性类型转换数组或集合拷贝性能对比测试在两个简单的Bean之间转换的耗时,执行次数分别为10、10…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

概述

常见或常用的几种Bean属性复制工具

  • Apache.BeanUtils
  • Apache.PropertyUtil
  • Spring.BeanUtils
  • Cglib.BeanCopier
  • MapStruct
  • EZMorph

使用场景:Dto与Entity转换

  • 普通属性复制
  • 个别属性过滤
  • 属性类型转换
  • 数组或集合拷贝

性能对比

测试在两个简单的Bean之间转换的耗时,执行次数分别为10、100、1k、10k、100k,时间单位为ms。
BeanCopier性能对比


源码分析

Apache.BeanUtils

org.apache.commons.beanutils

  1. 通过内省(Introspector)获取源类型的属性信息
  2. 判断源类型的属性是否可读及目标类型的属性是否可写
    • 可读
      • 有getter方法
    • 可写
      • 有setter方法
  3. 进行复制
    1. 获取属性名
    2. 获取属性类型
    3. 进行属性值转类型[自带类型转换器,提供注册自定义转换器接口]
    4. 赋值
      在这里插入图片描述

执行过程

  1. 获取工具实例,调用属性复制方法
    在这里插入图片描述
  2. 获取实例方法
    在这里插入图片描述
  3. 实例获取的函数是同步的,因为ContextClassLoader的不同,每个线程都会创建一个实例
    在这里插入图片描述
  4. 属性复制函数:先是空值的判断,然后通过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。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/197079.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PHP数组去重的更快实现方式分析

    PHP数组去重的更快实现方式分析PHP数组去重的更快实现方式分析

  • 常见JVM面试题及答案整理[通俗易懂]

    常见JVM面试题及答案整理[通俗易懂]前言总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新。1.什么情况下会发生栈内存溢出。思路:描述栈定义,再描述为什么会溢出,再说明一下相关配置参数,OK的话可以给面试官手写是一个栈溢出的demo。我的答案:栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作…

  • arm程序如何调试_arm开发板用什么语言

    arm程序如何调试_arm开发板用什么语言origin:http://blog.sina.com.cn/s/blog_70bb32080100lx1u.html又是一个多月没有动这个Blog嘿嘿,我发现一个有趣的现象,我的Blog在每年的1月底到2月中旬,7月、8月是淡季,每天访问量基本都在100以下,其它时间都是旺季,尤其9月和3月,每天可以到200以上,最高甚至500。我想因该是因为学生们是EE小站访问的主力吧——9月和3月是开

    2022年10月14日
  • 漏洞扫描和渗透性测试_漏洞扫描软件有哪些

    漏洞扫描和渗透性测试_漏洞扫描软件有哪些目录1.nessus2.AWVS3.WPscan1.nessus1.Nessus软件是什么?如图,我们可以从百度百科得知:Nessus是全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用Nessus作为扫描该机构电脑系统的软件。2.Nessus软件的安装1.下载地址DownloadNessus|Tenable®https://www.tenable.com/downloads/nessus如图所示,这个是下载官网。我们以..

  • 风讯.NET与NETCMS的选择—开源.NET内容管理系统

    风讯.NET与NETCMS的选择—开源.NET内容管理系统最近想要学习做一个网站,本来在某公司实习的时候,boss就要求快速的建立一个非盈利性的门户站点,当时用的是动易的SiteFactory3.0版本,感觉用起来也是很不错的,尤其是后台的可视化编缉做得是相当的到位,内容的采集部分也是很好使,初学者只要是不太笨的基本上就可以快速建立起一个功能比较好的站点了,不过令人没想到的是,建立好站点好以后才真的是恶梦的开始,boss提出要求,对它进行二次的开发,基…

  • nginx中proxy_pass的使用(alias和root使用)

    nginx中proxy_pass的使用(alias和root使用)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号