`
TNTest
  • 浏览: 12556 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于BeanUtil.copyProperties性能

阅读更多
BeanUtil.copyProperties 方法确实很方便,代码写出来非常优美,不会有很多的get set,但由于用到反射,可能存在潜在的性能问题。因此对spring 和 commons的BeanUtil.copyProperties进行了对照测试,代码大致如下:
@Test
	public void copyPropertiesTest() throws IllegalAccessException, InvocationTargetException {
		
		po = new PromotionPO();
		Timestamp now = new Timestamp(System.currentTimeMillis());
		model = RetailmodelFactory.eINSTANCE.createPromotion();
//get/set
		Long startTime = System.currentTimeMillis();
		for (int i = 0; i < LOOP_NUMBER; i++) {
			model.setCode("code");
			model.setDescription("haha");
			model.setDiscount(5.4);
			model.setEndTime(now);
			model.setID(39578395L);
			model.setPriority(1);
			model.setPromotionType(3);
			model.setStartTime(now);
			model.setSupplierID("123245L");
		}
		Long endTime = System.currentTimeMillis();
		traditionalCopyTIme = endTime - startTime;
		
//spring
		startTime = System.currentTimeMillis();
		for (int i = 0; i < LOOP_NUMBER; i++) {
			BeanUtils.copyProperties(model, po);
		}
		endTime = System.currentTimeMillis();
		springCopyPropertiesTime = endTime - startTime;

//commons		
		startTime = System.currentTimeMillis();
		for (int i = 0; i < LOOP_NUMBER; i++) {
			org.apache.commons.beanutils.BeanUtils.copyProperties(po,model);
		}
		endTime = System.currentTimeMillis();
		commonsCopyPropertiesTime = endTime - startTime;
		
		logger.info("normal copy Time: " +  traditionalCopyTIme + "ms.");
		logger.info("Spring BeanUtil copy Time: " +  springCopyPropertiesTime + "ms.");
		logger.info("Commons BeanUtil copy Time: " +  commonsCopyPropertiesTime + "ms.");
	}

当 LOOP_NUMBER = 50000时(即执行50000次copy),结果如下:
编号set/getSpring BeanUtilCommons BeanUtil
162ms1703ms63860ms
116ms1359ms62328ms
116ms1359ms63047ms
10ms1390ms63047ms
116ms1375ms62266ms


可看出Commons BeanUtil的copyProperties 性能最差,几乎不能忍受。spring的copyProperties有可能在接受范围内。直接set/get虽然丑陋,但是性能确实非常好,几乎可以忽略。
接下来对spring和commons两种不同实现进行分析。
分享到:
评论

相关推荐

    BeanUtil框架完整包

    3. **批量复制属性**:`BeanUtils.copyProperties(sourceBean, targetBean)`方法可以将源对象的所有公共可写属性值复制到目标对象,极大地减少了手动赋值的工作量。 4. **反射操作**:BeanUtils库利用Java反射API,...

    BeanUtil.java,对象属性拷贝工具

    BeanUtil.java,对象属性拷贝工具

    BeanUtil.java

    BeanUtil.java

    hutool框架代码

    一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件: 布隆过滤 缓存 克隆接口 类型转换 日期处理 ... 数据库ORM(基于ActiveRecord...

    bean和map之间转换的帮助类

    主要实现bean和map之间的相互转换,主要提供两个方法beanToMap将bean转换成Map 和mapToBean 将Map转换成bean 每次下载都没有积分,不差积分的大神赞助点呗 写了这一小段代码,供新手学习,大神就别拍砖了 身板弱扛...

    BeanUtil Jar包

    例如,通过`BeanUtil.setProperty(obj, "propertyName", value)`,我们可以直接对对象的"propertyName"属性赋值,而无需调用`setPropertyName()`方法。 2. **批量属性复制**:BeanUtil还提供了`copyProperties()`...

    BeanUtil属性拷贝工具类

    BeanUtil属性拷贝工具类,支持基本的javabean属性拷贝,通过java反射和泛型编程实现了list属性拷贝

    BeanUtil.rar

    BeanUtil需要的jar包和源码文件,commons-beanutils-1.8.0.jar,commons-beanutils-1.8.0-javadoc.jar,commons-beanutils-1.8.0-sources.jar,commons-beanutils-bean-collections-1.8.0.jar,commons-beanutils-...

    BeanUtilities工具类使用jar包

    4. 使用`BeanUtilities`填充Bean:通过`BeanUtilities.copyProperties()`方法,将数据源中的键值对映射到Bean的属性上。如果数据源是Map,键应该是Bean属性的名字,值则会被设置到对应的属性上。 5. 错误处理与日志...

    为什么不推荐使用BeanUtils属性转换工具示例详解

    BeanUtils.copyProperties(first, second); for (String each : second.getIds()) { System.out.println(each); } } } ``` 在上面的示例代码中,我们使用Spring的BeanUtils来拷贝A对象的属性到B对象中。但是,...

    commons-beanutils.jar

    通过`copyProperties()`方法,我们可以方便地将一个对象的所有属性值复制到另一个对象中,无需手动编写setter和getter方法。 2. **动态属性访问(Dynamic Property Access)**:BeanUtils支持通过字符串形式的属性...

    java 匿名内部类的使用规范

    Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。...

    BeanUtil_Jar包

    BeanUtils.copyProperties(destBean, srcBean); } } ``` 以上代码就实现了两个JavaBean对象之间属性的完全复制,无需关心具体的属性名称和类型,大大提高了开发效率。 此外,BeanUtil_Jar包还支持国际化(I18N)...

    beanutil:JavaBean 工具类

    maven-repo&lt;/id&gt; &lt;url&gt;https://raw.github.com/lychie/maven-repo/master/releases&lt;/url&gt; &lt;/repository&gt;&lt;/repositories&gt;&lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.lychie&lt;/groupId&gt; &lt;artifactId&gt;beanutil&lt;/...

    beanutil数据库操作工具

    3. **性能优化**:虽然BeanUtil简化了代码,但在大量数据操作时可能会有性能影响,应适当考虑其性能瓶颈,并在必要时进行优化。 4. **版本兼容性**:不同的BeanUtil版本可能有不同的API和功能,使用时需关注版本间...

    msssqlserver.jar\jspsmartupload.jar\classes.jar\jsf--api\jsf-impl.jar

    standard.jar msutil.jar mssqlserver.jar msbase.jar jstl.jar jspsmartupload.jar jsf-impl.jar jsf-api.jar classes.jar commons-digester.jar commons-collections.jar commons-beanutil.jar

    stream操作写法,原版pdf

    .map(user -&gt; BeanUtil.copyProperties(user, UserDTO.class)) .collect(Collectors.toList()); ``` 9. 将 Stream 转换成数组: ```java List&lt;Long&gt; ids = new ArrayList(list.size()); list.stream().skip(from)....

    J2EEwechat

    采用springMVC框架, public void save(PageData pd){ this.saveOrUpdate((T) BeanUtil.toBean(entityClass, pd)); }

Global site tag (gtag.js) - Google Analytics