1,工具类的特征
- 完成基本的属性复制功能;
- 不同类型的属性赋值,比如常见的基本类型与包装类型;
- 深拷贝和浅拷贝,注意在浅拷贝的时候,会引用同一个对象。
2,分析常见的集中对象拷贝的工具类
- Apache BeanUtils
- Spring BeanUtils
- Cglib BeanCopier
- Dozer
- orika
- MapStruct
在通常的业务中,如果不是说存在不同类型、不他那个字段名这样的情况可以直接使用
Spring BeanUtils
工具类,可以满足绝大多数场景,如果有特殊的需求的话,可以使用orika
等重量级的工具,可以参考连接。
(1),Apache BeanUtils
- 依赖:
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
- 使用(注意对应依赖的引入)
// DTO 对象转化到 DO 对象
BeanUtils.copyProperties(studentDO, studentDTO);
- 分析结论
- 1,嵌套对象字段,将会与源对象使用同一对象,即使用浅拷贝
- 2,类型不一致的字段,会默认将其进行类型转化;
- 3,但是其在内部实现中,使用了很多反射,做了很多校验,所以导致性能较差,所以在阿里的开发手册是强制规定避免使用 Apache BeanUtils。
(2),Spring BeanUtils
这里只是针对实体类会生效,而针对List集合直接赋值的话会失败,可能还要进一步的处理。
- 依赖
这里是通过单独引用说明的,但是实际上在实际的springboot-start依赖的父依赖中是已经有这个类了,我们可以直接使用(待验证:但是在实际编程中确实没有明确的引入这个依赖,也是可以使用的)。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
- 使用
注意:在复制对象的时候,顺序是A->B,则就是A复制到B。
// DTO 对象转化到 DO 对象
BeanUtils.copyProperties(studentDTO, studentDO);
// 另外该方法还有一个重载的方法,即可以设置忽略不想复制过去的属性
BeanUtils.copyProperties(studentDTO, studentDO,"name");
- 分析结论
- 1,类型不一致,属性无法复制。但是注意,如果类型为基本类型以及基本类型的包装类,这种可以转化。
- 2,嵌套对象字段,将会与源对象使用同一对象,即使用浅拷贝
网友评论