测试环境:
JDK1.6.29
CPU:I7 2.80 双核四线程
单位为纳秒
测试对象
1)spring包中的 BeanUtil 采用反射实现
2)cglib包中的 Beancopier 采用动态字节码实现
1.对象包含所有的基本类型
public class TestBeanSource1 {
private String str;
private byte b;
private short s;
private int i;
private long l;
private double d;
private float f;
private char c;
private boolean bb;
private List<String> ll;
private Map<String, String> map;
场景一:copy次数 :1
spring.beanUtil : costs : 57
cglib : costs : 0
场景二:copy次数 :10000
spring.beanUtil : total1:327
cglib : total2:55
场景三:copy次数 :100000
spring.beanUtil : total1:839
cglib : total2:392
场景四:copy次数 :1000000
spring.beanUtil : total1:5609
cglib : total2:3436
场景五:copy次数 :10000000
spring.beanUtil : total1:53597 avg: 0
cglib : total2:32668 avg: 0
从数据上我们可以看出,在小数量级上,cglib的性能优势明显,但是随着数据量增大,两者的差距基本在2:1。
取一个业务线上的实际对象做测试:
对象属性:
public class TestBeanSource2 {
private String userPW;
private String userEmail;
private String userNickName;
private Integer userCity;
private Integer userSource;
private Integer userPower;
private String userFace;
private Integer userVote;
private Integer userVoteGood;
private Integer userLogin;
private Integer userDailyLogin;
private Integer userHits;
private String userIP;
private Boolean isRefusePromo;
private Integer regInviteNo;
private Boolean isRefuseCard;
private Integer emailOption;
private Integer groupTotal;
private Integer userStatus;
private String userTags;
private String permaLink;
private String rawURL;
private Integer freeBookCity;
private Integer manaScore;
private Integer dcash;
private Integer userBigFace;
private Integer groupUserScore;
private Integer oldGroupUserScore;
private Integer manaOfReview;
private Integer manaOfShop;
private Integer manaOfPic;
private Integer manaOfOther;
private String mobileNO;
private Integer mobileNOStatus;
private Integer manaOfUserBase;
private Integer userEmailVerifyStatus;
场景一:copy次数 :1
spring.beanUtil : costs : 100160495
cglib : costs : 169295
场景二:copy次数 :10000
spring.beanUtil : 447733683 avg: 44
cglib : 56684493 avg: 5
场景三:copy次数 :100000
spring.beanUtil : 1278141962 avg: 127
cglib : 392142487 avg: 39
场景四:copy次数 :1000000
spring.beanUtil : 9722299911 avg: 972
cglib : 3292135548 avg: 329
场景五:copy次数 :10000000
spring.beanUtil : total1:91461239886 avg: 9146
cglib : total2:32762515523 avg: 3276
当我们拿实际的业务DO来做测试时候,规律同上,随着数量级的增大,两者之间的差距在降低,基本维持在3:1左右。
对比第一个测试,我们可以看出,随着业务对象的复杂度增高,cglib的性能相对反射之间的差距会越来越大。
故推荐使用cglib的beanCopier
cglib的简单使用:
public class CglibCopier extends BeanCopyTemplate {
private static final BeanCopier beanCopier2 = BeanCopier.create(TestBeanSource1.class,TestBeanTarget1.class, false);
@Override
public void handle(TestBeanSource2 source, TestBeanTarget2 target) {
beanCopier2.copy(source, target, null);
}
}
分享到:
相关推荐
这篇文章将对比分析Apache BeanUtils、PropertyUtils、Spring BeanUtils以及Cglib BeanCopier这四个常用的Bean复制工具的性能和特点。 首先,Apache BeanUtils是Apache Commons项目的一部分,提供了一系列便捷的...
在JSP开发中,Spring框架提供的BeanUtils组件是处理JavaBean的一个重要工具,它可以帮助开发者在不直接编写代码的情况下,完成JavaBean之间的属性复制工作。下面将详细讲解Spring BeanUtils组件的使用方法,并通过...
总的来说,Spring BeanUtils是Spring框架中的一个强大工具,能够简化JavaBean的处理,提高开发效率,但同时也需要开发者在使用时注意数据安全和类型转换的正确性。了解并熟练掌握BeanUtils的使用,对于日常的Spring...
BeanUtils最核心的好处在于:我们在编码时,并不需要知道我们处理的JavaBeans具体是什么类型,有哪些属性,这些信息是可以动态获取的,甚至我们都可以不必去关心事实上是否存在这样一个具体的JavaBean类。...
BeanUtils的核心功能在于属性的自动类型转换和封装,它能够自动处理JavaBeans对象之间的属性拷贝,即使源对象和目标对象的属性类型不完全匹配,BeanUtils也能尝试进行类型转换。例如,将字符串转换为整型或浮点型,...
在实际开发中,我们不仅可以通过BeanUtils来简化JavaBean的操作,还可以结合Spring框架中的BeanUtils,实现更高级的特性,比如AOP(面向切面编程)中的自动装配和属性注入。 总的来说,这个压缩包提供的BeanUtils...
在实际项目中,升级到`commons-beanutils-1.8.3`可能会带来更好的性能和稳定性,但也需要注意检查与现有代码的兼容性,确保所有功能仍然可以正常工作。在引入任何新的库或升级库时,进行充分的测试是至关重要的。...
由于BeanUtils(Spring或Apache Commons)的copyProperties实现是利用反射实现的,它在大量调用时具有比较严重的性能问题。 BeanMapper通过javassist类库实现在运行时直接生成字节码来转换类,在首次生成后,后续...
通过阅读源码,开发者可以了解到如何处理异常、如何优化性能,以及如何编写更加健壮和灵活的工具类。 在实际项目中,BeanUtils常被用于数据绑定,尤其是在MVC框架中,如Spring MVC。它可以将HTTP请求参数自动映射到...
3. **性能优化**:在某些情况下,Commons Logging能够避免不必要的类加载和初始化,从而提高应用性能。 4. **模块化**:日志记录可以根据不同的模块或组件进行配置,使得日志管理和调试更加精确。 这两个库的结合...
commons-beanutils.jar commons-collections-3.1.jar commons-lang-2.3.jar commons-logging-1.1.3.jar ezmorph-1.0.6.jar jackson-all-1.7.4.jar ojdbc5.jar org.springframework.aop-3.0.0.RELEASE.jar org.spring...
在实际开发中,Apache Commons BeanUtils常用于Web框架如Struts和Spring,以及任何需要进行JavaBean操作的场景。1.9.2版本的发布可能包含了性能优化、bug修复以及新特性的添加,确保了与现代Java环境的兼容性。 总...
相比其他如Spring的BeanUtils、Cglib的BeanCopier等工具,BeanUtils在处理大量对象复制时可能会导致性能瓶颈。这是因为BeanUtils内部实现中涉及了反射和异常处理,这些操作在循环中大量执行时会消耗更多的时间。 ...
- **1.8.0**:在此版本中,可能引入了新特性或修复了一些已知问题,增强了库的稳定性和性能。 - **1.8.2**和**1.8.3**:作为连续的小版本更新,这些版本通常包含对之前版本的错误修正和小规模的功能增强。 - **...
在本文中,我们将深入探讨`commons-beanutils-1.9.4`这个版本,了解其核心功能、使用场景以及如何在项目中集成和应用。 Apache Commons BeanUtils库的主要目标是简化JavaBean对象的属性访问。它通过提供一系列静态...
这个"commons-beanutils-1.8.2-src"官方源文件包,是学习和理解BeanUtils核心功能的宝贵资源。在这个版本中,我们可以深入到源代码层面,探究BeanUtils是如何实现对Java Bean属性的便捷访问、复制和转换的。 1. **...
- 在实际开发中,了解并掌握BeanUtils的内部工作原理,可以帮助我们更高效地使用这个库,避免不必要的性能损耗,同时也可以从中学习到如何优雅地使用反射和异常处理。 总结来说,Apache Commons BeanUtils是Java...
它是所有其他Spring模块的基础,提供了如Resource接口、BeanUtils工具类等核心功能。 8. cglib-nodep-2.1_3.jar:CGLIB是一个代码生成库,常用于动态创建子类以实现对目标类的方法增强。在Spring AOP中,CGLIB被...