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。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSH深度历险(四) Maven初步学�

    SSH深度历险(四) Maven初步学�

    2021年11月14日
    40
  • MySQL默认隔离级别是RR,但是为什么一些大厂会改成RC?

    MySQL默认隔离级别是RR,但是为什么一些大厂会改成RC?为什么默认隔离级别是RR?可能大部分人都只知道MySQL的隔离级别有4个,分别是RU读未提交、RC读已提交、RR可重复读和Serializable可串行化,很少有人知道MySQL默认的隔离级别是RR,Oracle默认的隔离级别是RC。那就更少有人知道为什么MySQL默认的隔离级别是RR了。我也是刚刚工作之余看到了一篇文章,里面简单提了一下这个问题,我就四处找寻了一下答案,将自己所理解的记录下来,希望对大家有帮助。理解脏读、不可重复读、幻读脏读:某个事务对一份数据执行了更新操作,另一个事务在此时读

    2022年9月3日
    3
  • 费曼学习法

    费曼学习法费曼学习法我的理解:费曼学习法就是把学好的东西用简洁易懂的语言,传授给别人举例:你学完微积分,然后自己去培训班,自己做老师,传授给学生们,并且学生们都能听懂费曼学习法的四个步骤:1.确定目标

    2022年7月28日
    3
  • NSGA2算法详解「建议收藏」

    NSGA2算法详解「建议收藏」目录预备知识多目标优化问题的解NSGA-II简介NSGA-II详细介绍参数设置问题约束处理方法1.预备知识多目标优化的相关知识:https://blog.csdn.net/haha0332/article/details/88634378支配:假设小明9岁,50斤,小红8岁,45斤,小明无论是岁数还是体重都比小红大,所以小明支配小红。互不支配:假设小明7岁,50斤,小红8岁,45斤,小明岁数比小红小,但体重比小红大,所以小明和小红互不支配。帕累托集:在这个集合中,任意两个解互不

    2022年5月12日
    60
  • goland 激活码2021(破解版激活)

    goland 激活码2021(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    472
  • 7-1 判断回文字符串

    7-1 判断回文字符串7-1判断回文字符串(15分)输入一个字符串,判断该字符串是否为回文。回文就是字符串中心对称,从左向右读和从右向左读的内容是一样的。输入格式:输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。输出格式:输出在第1行中输出字符串。如果它是回文字符串,在第2行中输出Yes,否则输出No。输入样例1:level输出样例1:levelYes输入样例2:1+2=2+1=输出样例2:1+2=2+1=No双指针法#include<s

    2022年5月29日
    60

发表回复

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

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