Apache BeanUtils与Spring BeanUtils的拷贝性能比较

Spring BeanUtils的属性拷贝,注意点,从Apache切换过来存在的问题 文章目录Spring BeanUtils的属性拷贝,注意点,从Apache切换过来存在的问题1、Apache 的源码2、Spring 的源码3、Spring 的拷贝源码4、拷贝源码的核心源码 getWriteMethod()方法5、推荐的方案和注意点1、推荐使用Spring 的拷贝方案2、注意点 Spring BeanUtils的属性拷贝,注意点,从Apache切换过来存在的问题 1、Apach... 阅读详情

Apache BeanUtils需要引入的包:

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.4</version>
        </dependency>

测试同一个对象使用两种拷贝方法的耗时,具体代码如下,

 @Test
    void Copy() throws InvocationTargetException, IllegalAccessException {

        UserInfo userData = this.userInfoService.getUserData("0951d015472946fcbc039f9dff6f13c3");
        UserInfo springBean = new UserInfo();
        long springBegin = System.currentTimeMillis();
        BeanUtils.copyProperties(userData,springBean);
        long springAfter = System.currentTimeMillis();
        System.out.println("共耗时" + (springAfter - springBegin) + "毫秒");


        UserInfo apacheBean = new UserInfo();
        long apacheBegin = System.currentTimeMillis();
        org.apache.commons.beanutils.BeanUtils.copyProperties(apacheBean,userData);
        long apacheAfter = System.currentTimeMillis();
        System.out.println("共耗时" + (apacheAfter - apacheBegin) + "毫秒");

    }

拷贝的对象UserInfo,六个字段,

测试两次的耗时为以下截图:

两次比较,Apache BeanUtils使用的时间明显比Spring BeanUtils要长很多,再加上实际开发环境中,JavaBean拷贝的字段跟多,所以耗时会更长。

 

源码分析:

Apache BeanUtils

public void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException {
        if (dest == null) {
            throw new IllegalArgumentException("No destination bean specified");
        } else if (orig == null) {
            throw new IllegalArgumentException("No origin bean specified");
        } else {
            if (this.log.isDebugEnabled()) {
                this.log.debug("BeanUtils.copyProperties(" + dest + ", " + orig + ")");
            }

            int var5;
            int var6;
            String name;
            Object value;
            if (orig instanceof DynaBean) {
                DynaProperty[] origDescriptors = ((DynaBean)orig).getDynaClass().getDynaProperties();
                DynaProperty[] var4 = origDescriptors;
                var5 = origDescriptors.length;

                for(var6 = 0; var6 < var5; ++var6) {
                    DynaProperty origDescriptor = var4[var6];
                    name = origDescriptor.getName();
                    if (this.getPropertyUtils().isReadable(orig, name) && this.getPropertyUtils().isWriteable(dest, name)) {
                        value = ((DynaBean)orig).get(name);
                        this.copyProperty(dest, name, value);
                    }
                }
            } else if (orig instanceof Map) {
                Map<String, Object> propMap = (Map)orig;
                Iterator var13 = propMap.entrySet().iterator();

                while(var13.hasNext()) {
                    Entry<String, Object> entry = (Entry)var13.next();
                    String name = (String)entry.getKey();
                    if (this.getPropertyUtils().isWriteable(dest, name)) {
                        this.copyProperty(dest, name, entry.getValue());
                    }
                }
            } else {
                PropertyDescriptor[] origDescriptors = this.getPropertyUtils().getPropertyDescriptors(orig);
                PropertyDescriptor[] var14 = origDescriptors;
                var5 = origDescriptors.length;

                for(var6 = 0; var6 < var5; ++var6) {
                    PropertyDescriptor origDescriptor = var14[var6];
                    name = origDescriptor.getName();
                    if (!"class".equals(name) && this.getPropertyUtils().isReadable(orig, name) && this.getPropertyUtils().isWriteable(dest, name)) {
                        try {
                            value = this.getPropertyUtils().getSimpleProperty(orig, name);
                            this.copyProperty(dest, name, value);
                        } catch (NoSuchMethodException var10) {
                        }
                    }
                }
            }

        }
    }

Apache BeanUtils一上来先进行了三个if判断,之后在进行对象拷贝,而Spring BeanUtils则简单多了。

private static void copyProperties(Object source, Object target, @Nullable Class<?> editable,
			@Nullable String... ignoreProperties) throws BeansException {

		Assert.notNull(source, "Source must not be null");
		Assert.notNull(target, "Target must not be null");

		Class<?> actualEditable = target.getClass();
		if (editable != null) {
			if (!editable.isInstance(target)) {
				throw new IllegalArgumentException("Target class [" + target.getClass().getName() +
						"] not assignable to Editable class [" + editable.getName() + "]");
			}
			actualEditable = editable;
		}
		PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);
		List<String> ignoreList = (ignoreProperties != null ? Arrays.asList(ignoreProperties) : null);

		for (PropertyDescriptor targetPd : targetPds) {
			Method writeMethod = targetPd.getWriteMethod();
			if (writeMethod != null && (ignoreList == null || !ignoreList.contains(targetPd.getName()))) {
				PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
				if (sourcePd != null) {
					Method readMethod = sourcePd.getReadMethod();
					if (readMethod != null &&
							ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {
						try {
							if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
								readMethod.setAccessible(true);
							}
							Object value = readMethod.invoke(source);
							if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
								writeMethod.setAccessible(true);
							}
							writeMethod.invoke(target, value);
						}
						catch (Throwable ex) {
							throw new FatalBeanException(
									"Could not copy property '" + targetPd.getName() + "' from source to target", ex);
						}
					}
				}
			}
		}
	}

除了以上两种拷贝对象的工具类,还有MapStruct、Dozer和ModelMapper等等。

Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier NULL 博文链接:https://m635674608.iteye.com/blog/2270455 立即下载

相关推荐

USB3.0一致性测试方案

为各测试项目具体测试结果包括脉冲串突发时间、脉冲串重复时间、时钟周期以及眼图等完整USB3.0测试项目,工程师可以看到各项测试的具体结果方便观察。RIGOL 提供了一套完善的工具,包括数字示波器、专业的测试夹具以及全自动一致性测试软件,使得USB 3.0设备设计人员能够高效精确地进行信号捕捉、测试与分析。报告第二部分测试摘要,在此可以看到USB3.0测试所有测试项目,并且可以观看到测试是否正常,可以帮助工程师更好的判断测试结果。,以简化下载、存储以及对于多媒体的大量内容的共享。

2409_87378937的博客 2526

使用esotericsoftware高速缓存(ASM)的BeanUtils.copyProperties!高性能!

一、事出有因 项目中使用BeanUtils.copyProperties但是其性能又不是很满意, 而且阿里发布了阿里巴巴代码规约插件指明了在Apache BeanUtils.copyProperties()方法后面打了个大大的红叉,提示"避免使用Apache的BeanUtils进行属性的copy"。心里确实不是滋味,从小老师就教导我们,"凡是Apache写的框架都是好框架",怎么可能会存在"性能问题"--还是这种猿们所不能容忍的问题。心存着对BeanUtils的怀疑开始了今天的研究之路。 二、市面上的

sunny的专栏 6173

深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)

深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)

她是不会无条件的!! 2万+

java beanutils 性能_Java Bean复制性能对比

性能对比工具名称执行100次耗时10000次100000次1000000次Apache BeanUtils347ms606ms2345ms12552msDozerBeanMapper241ms456ms1538ms8273msSpring BeanUtils71ms164ms146ms640msCglib BeanCopier60ms102ms120ms239msSelma3ms12ms35ms5...

weixin_36464343的博客 871

CMOS的宽/长比、传输门与三态门、锁存器与触发器、简单版图、竞争与冒险

目录 1.CMOS的宽长比 2.传输门与三态门 传输门 三态门 3.锁存器与触发器 3.1RS锁存器[3] 3.2D锁存器 3.3D触发器 4.简单CMOS器件的版图 5.竞争与冒险 1.CMOS的宽长比 关于COMS原理及结构图可以参考[1]COMS原理及门电路设计. 栅在源漏方向的长度称作栅的长L,垂直方向称为栅的宽W,如图1中NMOS的版图。 图1 以MOS管...

king阿金 1万+

电力抄表协议DL/T645和698.45到底有啥区别?一张图帮你选对协议

本文深入对比了电力抄表协议DL/T645和DL/T698.45的技术差异,从协议架构、报文结构、功能覆盖到实施成本进行全面分析。通过实际案例和数据,揭示698.45协议在通信效率、业务扩展性和长期成本上的优势,并提供清晰的选型决策流程图,帮助工程师根据具体需求选择最适合的电力抄表协议。

weixin_38168696的博客 401

对象拷贝 Apache BeanUtils与Spring BeanUtils性能比较

前言 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性复制到DTO,但是对象格式又不一样,所以我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型。 这种转换最原始的方式就是手动编写大量的 get/set代码,当然这是我们开发过程不愿意去做的,因为它确实显得很繁琐。为了解决这一痛点,就诞生了一些方便的类库,常用的有 apache的 BeanUtil

LoveSummer 3174

电机控制框架选型指南:从TI MotorWare到ST MC SDK,5种架构优缺点对比

本文深入对比了TI MotorWare、ST MC SDK、AUTOSAR、FPGA+ARM及集成方案等五种主流电机控制软件框架的架构特点、实时性、开发效率与硬件兼容性。通过工业伺服和消费电子的实战案例分析,为工程师提供了清晰的选型逻辑与决策清单,旨在帮助规避技术债务,选择最适合项目需求的电机控制框架。

rnn9storyteller的博客 1172

已收藏!kafka服务器最大消息

Part 1微服务架构设计概述 1.1 传统应用架构的问题 1.2 微服务架构是什么 1.3 微服务架构有哪些特点和挑战 1.4 如何搭建微服务架构 Part 2微服务开发框架 2.1 Spring Boot 是什么 2.2 如何使用Spring Boot框架 2.3 Spring Boot生产级特性 Part 3微服务网关 3.1 Node.js 是什么 3.2 如何使用 Node.js 3.3 使用Node.js搭建微服务网关 Part 4微服务注册与发现. 4.1 ZooKeepe

qq_38514574的博客 338

【Claude Code 源码解析教程】总体大纲

本教程旨在深入解析 Anthropic Claude Code 项目的源码架构和实现细节。Claude Code 是一个基于 TypeScript + Bun 构建的 AI 编程助手 CLI 工具,代号 "Tengu",具有复杂的多模块架构和丰富的功能特性。本教程基于Claude Code 的源码分析来生成,将帮助您全面掌握 Claude Code 的源码架构和实现细节,为开发类似 AI 编程助手工具奠定坚实基础。

rengang66的博客 386

Unity3D实现自定义河流路径或泥石流路径

此工具是一个插件,插件很好用,可以根据地形编辑河流的走向以及宽度,也可以发挥想象编辑成其他的效果,比如泥石流效果,岩浆效果,小溪,或者大江或者大河等等博客将会介绍可以编辑河流的工具的使用。希望这篇博客对Unity的开发者有所帮助。大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。提示:以下是本篇文章正文内容,下面案例可供参考本次总结的就是工具的使用, 有需要会继续增加功能不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!

心疼你的一切博客 5264

spring的BeanUtils和cglib的BeanCopier性能比较

  测试环境: JDK1.6.29 CPU:I7 2.80 双核四线程 单位为纳秒 测试对象    1)spring包中的 BeanUtil     采用反射实现 2)cglib包中的  Beancopier   采用动态字节码实现     1.对象包含所有的基本类型  public class TestBeanSource1 {       private Strin...

知行天下 2192

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验(一)

阿里云推出国内首个集成“快思考”与“慢思考”能力的 Qwen3-8B 大语言模型,以80亿参数和 128K 上下文支持,重塑AI应用边界并助力开发者高效部署

以微薄之力,予他人些许温暖. 2万+

浅析Java中Apache BeanUtils和Spring BeanUtils的用法

# 前言 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性复制到DTO,但是对象格式又不一样,所以我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型。 # 对象拷贝 在具体介绍两种 BeanUtils 之前,先来补充一些基础知识。它们两种工具本质上就是对象拷贝工具,而对象拷贝又分为深拷贝和浅拷贝,下面进行详细解释。 # 什么是浅拷贝和深拷

449

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java 对象复制工具_五种对象属性拷贝工具类大全 Bean的属性拷贝从此不用愁

1.引言大家在做java开发时,肯定会遇到api层参数对象传递给服务层,或者把service层的对象传递给dao层,他们之间又不是同一个类型对象,但字段又是一样,如果还是用普通的get、set方式来处理话,比较繁琐,.... 那么来跟我学....."天下武功,唯快不破"....突突突--biubiu---2.大全套餐使用get/set不用说了,字段一多脑壳大....使用了cglib的修改字节码,真...

weixin_36382556的博客 2330

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java dozer数组_对象mapping dozer,各种实现对比

DozerDozer is a Java Bean to Java Bean mapper that recursively copies data from one object to another. Typically, these Java Beans will be of different complex types.Dozer supports simple property map...

weixin_42395213的博客 305

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java中实现对象深拷贝的几种方式对比

Apache Commons | 中 | 高 | 中 | Commons Lang || Spring BeanUtils | 中 | 高 | 高 | Spring框架 || 序列化方式 | 低 | 高 | 中 | Serializable接口 |通过实现Cloneable接口并重写clone()方法实现深拷贝。| 实现方式 | 性能 | 易用性 | 灵活性 | 依赖要求 || JSON序列化 | 中低 | 高 | 高 | JSON库 || Cloneable接口 | 高 | 中 | 低 | 无 |

IexNQrnj的博客 461

java对象拷贝工具简要记录

项目中经常会用到对象拷贝,对于浅拷贝,一般让对象实现Cloneable 接口即可,对于深度拷贝,在工作中用到过以下组件。现简要说明如下。 组件名称 组件源 性能 拷贝原理 能否对不同属性名映射 其他特性 BeanUtils spring 相对较低 反射 否 支持名称相同但类型不同的属性的转换 BeanUti...

阅微草堂 251

【转存学习】BeanUtils 是用 Spring 的还是 Apache 的好?

BeanUtils 是用 Spring 的还是 Apache 的好?

runewbie的博客 303

对象拷贝之Apache BeanUtils、Spring的BeanUtils、Mapstruct、BeanCopier、PropertieyUtils对比(深拷贝)

大多时候时候使用的是Apache或Spring``BeanUtils,今天,我们来看一下一个更高效的属性拷贝方式:BeanCopier。 https://github.com/cglib/cglib https://github.com/cglib/cglib/blob/master/cglib/src/main/java/net/sf/cglib/beans/BeanCopier.java 首先梳理出来现在有哪些对象拷贝的方式: Apache的BeanUtils:BeanUtils是Apach.

赵英超的博客 9836

spring.BeanUtils与apache.BeanUtils对象属性copy的性能对比以及源码分析

文章目录1. 对象属性拷贝的常见方式及其性能2. Introspector3. 源码:apache.BeanUtils3.1 针对标准JavaBean进行属性copy时的步骤3.2 判断属性是否可读/可写3.3 读取原始Bean的属性值、设置目标Bean的属性值4. 源码: spring.BeanUtils4.1 获取Bean的PropertyDescriptor4.2 属性值copy5. 总结5...

alleyz 6119

Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils、Spring BeanUtils、Cglib BeanCopier)

文章转载自:Bean复制的几种框架性能比较 Bean复制的几种框架性能比较: 测试结果: 10次测验 第一次 第二次 第三次 平均值 每次平均值 BeanUtil.copyProperties 54 57 50 53.66667 5.366666667 PropertyUtils.copyProperties 4 4 4 4 0.4 org.springframework....

@龙猫的博客 7805

Apache BeanUtils和Spring BeanUtils对比

# 前言 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性复制到DTO,但是对象格式又不一样,所以我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型。 # 对象拷贝 在具体介绍两种 BeanUtils 之前,先来补充一些基础知识。它们两种工具本质上就是对象拷贝工具,而对象拷贝又分为深拷贝和浅拷贝,下面进行详细解释。 # 什么是浅拷贝和深拷

dongbeiou的专栏 2216

Apache的BeanUtils、Spring的BeanUtils、Mapstruct、BeanCopier对象拷贝

在项目中,尤其是在服务层,经常要将服务中的Dto实体对象拷贝到Entity对象用于前端展示。反过来也是一样,需要将前端请求对象转换为服务端的数据对象。现在市面上有很多这样的工具包,比如spring框架中就自带了BeanUtils,使我们进行这样的数据操作十分简单快捷。但是一直以来却没有关注到对象属性的拷贝性能问题,最近在想:单个对象的拷贝是快速的,可以不在意太多性能问题,可是如果数量级变大了会怎样呢?如果数量级到达了百万级别,会出现什么样的情况呢? 带着心中的疑问,我首先梳理出来现在有哪些对象拷贝的方式:

Trend_H的博客 1740

BeanUtils 是用 Spring 的还是 Apache ,那个效率更好。

说明: 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性复制到DTO,但是对象格式又不一样,所以我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型。 这种转换最原始的方式就是手动编写大量的get/set代码,当然这是我们开发过程不愿意去做的,因为它确实显得很繁琐。为了解决这一痛点,就诞生了一些方便的类库,常用的有 apache的BeanU..

houxian1103的博客 1868

Apache BeanUtils和Spring BeanUtils

一、对象拷贝 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性复制到DTO,但是对象格式又不一样,所以我们需要编写映射代码将对象中的属性值从一种类型转换成另一种类型。 在具体介绍两种BeanUtils之前,先来补充一些基础知识。它们两种工具本质上就是对象拷贝工具,而对象拷贝又分为深拷贝和浅拷贝,下面进行详细解释。 1. 什么是浅拷贝和深拷贝 在Jav

程序员博客 670
上一篇: SpringBoot整合Jedis详细步骤
下一篇: Spring项目 AOP+自定义注解方式实现访问量统计功能
你愁啥啊
博客等级 码龄11年 8粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值