BeanCopier性能对比

BeanCopier性能对比概述常见或常用的几种 Bean 属性复制工具 Apache BeanUtilsApa PropertyUtil BeanUtilsCgl BeanCopierMa 使用场景 Dto 与 Entity 转换普通属性复制个别属性过滤属性类型转换数组或集合拷贝性能对比测试在两个简单的 Bean 之间转换的耗时 执行次数分别为 10 10

概述

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

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

使用场景:Dto与Entity转换

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

性能对比


源码分析

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自带类型转换器,支持如下类型转换:

  • 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方法。
    在这里插入图片描述
    (支持自定义类型转换器)

    生成的BeanCopier里面直接使用Bean的setter/getter


MapStruct

org.mapstrcut.*

使用示例

  • 自定义Mapper类

在这里插入图片描述

  • 编译生成实现类

在这里插入图片描述

  • Bean复制

在这里插入图片描述


EZMorph

性能感人,不做深究。

也是通过反射


功能维度对比

根据属性复制工具的功能维度对工具进行分析,对比如下:

  • Apache.BeanUtils
    在这里插入图片描述
  • Apache.PropertyUtil
    在这里插入图片描述
  • Spring.BeanUtils
    在这里插入图片描述
  • Cglib.BeanCopier
    在这里插入图片描述
  • MapStruct
    在这里插入图片描述
  • EZMorph
    在这里插入图片描述

总结

根据不同工具的性能及功能维度,个人建议当对象转换操作较少或者应用对性能要求较高时,尽量不采用工具,而是手写getter/setter;在不考虑性能的情况下,普通的对象转换可以使用Cglib.BeanCopier,复杂的对象转换使用MapStruct。

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228637.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午6:33
下一篇 2026年3月16日 下午6:34


相关推荐

  • java string.split()用字符串分割_java 字符串分割

    java string.split()用字符串分割_java 字符串分割最近写代码时遇到自字符串分割和截取的问题,在此总结一下。字符串的分割:一般自字符串的分割常用的方法是java.lang包中的String.split()方法,返回是一个字符串数组。语法:publicString[]split(Stringregex,intlimit)参数: regex–正则表达式分隔符。 limit–分割的份数。…

    2025年11月11日
    5
  • HTML中加入空格和Tab

    HTML中加入空格和Tab空格 Tab 注意,Tab只有在…这样的标记内部才起作用,在其他地方只相当于一个空格。举例:p,li{white-space:pre-wrap;}灿哥哥   的 博客显示效果

    2022年6月16日
    153
  • java jks 转pfx_JKS和PFX文件相互转换方法「建议收藏」

    java jks 转pfx_JKS和PFX文件相互转换方法「建议收藏」JKS(JavaKeysotre)格式和PFX(PKCS12)格式,是最常见的SSL证书格式文件,可以包含完整的证书密钥对,证书链和信任证书信息。PFX常用于WindowsIIS服务器,JKS常用语JAVA类的WEB服务器,如TOMCAT,WEBLOGIC,JBOSS,RESIGN,虽然近年来,这些服务器新的版本,都是可以同时支持PFX,JKS文件格式了,但是老的版本和免费版本,往往都只支持JK…

    2022年5月1日
    148
  • UE4 显示帧率的几种姿势「建议收藏」

    在使用UE4Editor或者UE4Game时,有时候需要查看帧率,以及每帧耗时情况。在Editor中显示:键盘上按下~可以看到有个输入框出现:在输入框输入statfps或者statunit,出现帧率或者耗时:在Game中显示(1):启动Game.exe后,键盘按下~出现输入框,输入框中输入statfps或者statunit,回车:在

    2022年4月14日
    326
  • 如何用python画爱心表白_python 简短 表白

    如何用python画爱心表白_python 简短 表白利用python画爱心表白

    2025年9月25日
    7
  • mysql数据库报错1146_数据库错误代码1146 – 本地与在线

    mysql数据库报错1146_数据库错误代码1146 – 本地与在线我是这个站点的新手-请温和请:Plocalhost上的mySQL数据库适用于插入语句,但只要将数据库连接更改为服务器连接它给了我错误:错误代码1146:1146没有任何错误描述。可能是什么原因?根据我的错误捕获逻辑,连接一直成功到查询运行的一部分。在本地版本上,它就像一个魅力。有任何想法吗?数据库错误代码1146-本地与在线:::::::::::::::::::::::::::::::::…

    2022年6月1日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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