失效链接处理 |
《Java开发手册(嵩山版)灵魂15问》 PDF 下载
本站整理下载:
相关截图:
主要内容:
在日常开发中,我们经常需要给对象进行赋值,通常会调用其 set/get 方法,有
些时候,如果我们要转换的两个对象之间属性大致相同,会考虑使用属性拷贝工具
进行。
如我们经常在代码中会对一个数据结构封装成 DO、SDO、DTO、VO 等,而
这些 Bean 中的大部分属性都是一样的,所以使用属性拷贝类工具可以帮助我们节省
大量的 set 和 get 操作。
市面上有很多类似的工具类,比较常用的有
1. Spring BeanUtils
2. Cglib BeanCopier
3. Apache BeanUtils
4. Apache PropertyUtils
5. Dozer
那么,我们到底应该选择哪种工具类更加合适呢?为什么 Java 开发手册中提到
禁止使用 Apache BeanUtils 呢?
由于篇幅优先,关于这几种工具类的用法及区别,还有到底是什么是浅拷贝和深
为什么禁止使用 Apache Beanutils 进行属性的 copy ? < 5
拷贝不在本文的讨论范围内。
本文主要聚焦于对比这几个类库的性能问题。
性能对比
No Data No BB,我们就来写代码来对比下这几种框架的性能情况。
代码示例如下:
首先定义一个 PersonDO 类:
public class PersonDO {
private Integer id;
private String name;
private Integer age;
private Date birthday;
// 省略 setter/getter
}
再定义一个 PersonDTO 类:
public class PersonDTO {
private String name;
private Integer age;
private Date birthday;
}
然后进行测试类的编写:
使用 Spring BeanUtils 进行属性拷贝:
private void mappingBySpringBeanUtils(PersonDO personDO, int times) {
StopWatch stopwatch = new StopWatch();
stopwatch.start();
for (int i = 0; i < times; i++) {
PersonDTO personDTO = new PersonDTO();
org.springframework.beans.BeanUtils.copyProperties(personDO, personDTO);
}
6 > 为什么禁止使用 Apache Beanutils 进行属性的 copy ?
stopwatch.stop();
System.out.println("mappingBySpringBeanUtils cost :" + stopwatch.
getTotalTimeMillis());
}
其中的 StopWatch 用于记录代码执行时间,方便进行对比。
使用 Cglib BeanCopier 进行属性拷贝:
|