為什么阿里巴巴禁止使用Apache Beanutils進(jìn)行屬性的copy?



public?class?PersonDO?{
????private?Integer?id;
????private?String?name;
????private?Integer?age;
????private?Date?birthday;
????//省略setter/getter
}
public?class?PersonDTO?{
????private?String?name;
????private?Integer?age;
????private?Date?birthday;
}
private?void?mappingBySpringBeanUtils(PersonDO?personDO,?int?times)?{
????StopWatch?stopwatch?=?new?StopWatch();
????stopwatch.start();
????for?(int?i?=?0;?i?
????????PersonDTO?personDTO?=?new?PersonDTO();
????????org.springframework.beans.BeanUtils.copyProperties(personDO,?personDTO);
????}
????stopwatch.stop();
????System.out.println("mappingBySpringBeanUtils?cost?:"?+?stopwatch.getTotalTimeMillis());
}
private?void?mappingByCglibBeanCopier(PersonDO?personDO,?int?times)?{
????StopWatch?stopwatch?=?new?StopWatch();
????stopwatch.start();
????for?(int?i?=?0;?i?
????????PersonDTO?personDTO?=?new?PersonDTO();
????????BeanCopier?copier?=?BeanCopier.create(PersonDO.class,?PersonDTO.class,?false);
????????copier.copy(personDO,?personDTO,?null);
????}
????stopwatch.stop();
????System.out.println("mappingByCglibBeanCopier?cost?:"?+?stopwatch.getTotalTimeMillis());
}
private?void?mappingByApacheBeanUtils(PersonDO?personDO,?int?times)
????throws?InvocationTargetException,?IllegalAccessException?{
????StopWatch?stopwatch?=?new?StopWatch();
????stopwatch.start();
????for?(int?i?=?0;?i?
????????PersonDTO?personDTO?=?new?PersonDTO();
????????BeanUtils.copyProperties(personDTO,?personDO);
????}
????stopwatch.stop();
????System.out.println("mappingByApacheBeanUtils?cost?:"?+?stopwatch.getTotalTimeMillis());
}
private?void?mappingByApachePropertyUtils(PersonDO?personDO,?int?times)
????throws?InvocationTargetException,?IllegalAccessException,?NoSuchMethodException?{
????StopWatch?stopwatch?=?new?StopWatch();
????stopwatch.start();
????for?(int?i?=?0;?i?
????????PersonDTO?personDTO?=?new?PersonDTO();
????????PropertyUtils.copyProperties(personDTO,?personDO);
????}
????stopwatch.stop();
????System.out.println("mappingByApachePropertyUtils?cost?:"?+?stopwatch.getTotalTimeMillis());
}
public?static?void?main(String[]?args)
????throws?InvocationTargetException,?IllegalAccessException,?NoSuchMethodException?{
????PersonDO?personDO?=?new?PersonDO();
????personDO.setName("Hollis");
????personDO.setAge(26);
????personDO.setBirthday(new?Date());
????personDO.setId(1);
????MapperTest?mapperTest?=?new?MapperTest();
????mapperTest.mappingBySpringBeanUtils(personDO,?100);
????mapperTest.mappingBySpringBeanUtils(personDO,?1000);
????mapperTest.mappingBySpringBeanUtils(personDO,?10000);
????mapperTest.mappingBySpringBeanUtils(personDO,?100000);
????mapperTest.mappingBySpringBeanUtils(personDO,?1000000);
????mapperTest.mappingByCglibBeanCopier(personDO,?100);
????mapperTest.mappingByCglibBeanCopier(personDO,?1000);
????mapperTest.mappingByCglibBeanCopier(personDO,?10000);
????mapperTest.mappingByCglibBeanCopier(personDO,?100000);
????mapperTest.mappingByCglibBeanCopier(personDO,?1000000);
????mapperTest.mappingByApachePropertyUtils(personDO,?100);
????mapperTest.mappingByApachePropertyUtils(personDO,?1000);
????mapperTest.mappingByApachePropertyUtils(personDO,?10000);
????mapperTest.mappingByApachePropertyUtils(personDO,?100000);
????mapperTest.mappingByApachePropertyUtils(personDO,?1000000);
????mapperTest.mappingByApacheBeanUtils(personDO,?100);
????mapperTest.mappingByApacheBeanUtils(personDO,?1000);
????mapperTest.mappingByApacheBeanUtils(personDO,?10000);
????mapperTest.mappingByApacheBeanUtils(personDO,?100000);
????mapperTest.mappingByApacheBeanUtils(personDO,?1000000);
}
| 工具類 | 執(zhí)行1000次耗時(shí) | 執(zhí)行10000次耗時(shí) | 執(zhí)行100000次耗時(shí) | 執(zhí)行1000000次耗時(shí) |
|---|---|---|---|---|
| Spring BeanUtils | 5ms | 10ms | 45ms | 169ms |
| Cglib BeanCopier | 4ms | 18ms | 45ms | 91ms |
| Apache PropertyUtils | 60ms | 265ms | 1444ms | 11492ms |
| Apache BeanUtils | 138ms | 816ms | 4154ms | 36938ms |
| Dozer | 566ms | 2254ms | 11136ms | 102965ms |
畫了一張折線圖更方便大家進(jìn)行對比

<dependency>
????<groupId>commons-beanutilsgroupId>
????<artifactId>commons-beanutilsartifactId>
????<version>1.9.4version>
dependency>
<dependency>
????<groupId>commons-logginggroupId>
????<artifactId>commons-loggingartifactId>
????<version>1.1.2version>
dependency>
<dependency>
????<groupId>org.springframeworkgroupId>
????<artifactId>org.springframework.beansartifactId>
????<version>3.1.1.RELEASEversion>
dependency>
<dependency>
????<groupId>cglibgroupId>
????<artifactId>cglib-nodepartifactId>
????<version>2.2.2version>
dependency>
<dependency>
????<groupId>net.sf.dozergroupId>
????<artifactId>dozerartifactId>
????<version>5.5.1version>
dependency>
<dependency>
????<groupId>org.slf4jgroupId>
????<artifactId>slf4j-apiartifactId>
????<version>1.7.7version>
dependency>
<dependency>
????<groupId>org.slf4jgroupId>
????<artifactId>jul-to-slf4jartifactId>
????<version>1.7.7version>
dependency>
<dependency>
????<groupId>org.slf4jgroupId>
????<artifactId>jcl-over-slf4jartifactId>
????<version>1.7.7version>
dependency>
<dependency>
????<groupId>org.slf4jgroupId>
????<artifactId>log4j-over-slf4jartifactId>
????<version>1.7.7version>
dependency>
<dependency>
????<groupId>org.slf4jgroupId>
????<artifactId>slf4j-jdk14artifactId>
????<version>1.7.7version>
dependency>
往期推薦

阿里的簡歷多久可以投遞一次?次數(shù)多了有沒有影響?可以同時(shí)進(jìn)行嗎?

什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站…z站?

一口氣說出 4 種分布式一致性 Session 實(shí)現(xiàn)方式,面試杠杠的~
直面Java第329期:哪個命令可以監(jiān)控虛擬機(jī)各種運(yùn)行狀態(tài)信息?
深入并發(fā)第013期:拓展synchronized——鎖優(yōu)化
如果你喜歡本文,
請長按二維碼,關(guān)注?Hollis.
轉(zhuǎn)發(fā)至朋友圈,是對我最大的支持。
