Bean拷贝工具
Apache BeanUtils
Spring BeanUtils
cglib BeanCopier
Hutool BeanUtil
Mapstruct
Dozer
1、Apache BeanUtils:
在Bean中具有相同名称的属性分别是基本数据类型和包装类时,比如分别是int和Integer时,可以正常进行拷贝,在拷贝中,如果存在引用对象,那么使用的是浅拷贝。
使用===========》BeanUtils.copyProperties(orderDTO,orderPO);【第一个是目标对象,第二个是源对象】
2、Spring BeanUtils:
使用=============》BeanUtils.copyProperties(orderPO,orderDTO);【第一个源对象,第二个目标对象】
使用的还是浅拷贝;Spring BeanUtils内部使用了缓存,加快转换的速度。spring的BeanUtils还提供了额外的方法,这个可变参数的方法可以忽略某些属性进行拷贝:-------》BeanUtils.copyProperties(orderPO,orderDTO,"orderNumber");
3、cglib BeanCopier:
使用===========》BeanCopier beanCopier = BeanCopier.create(
orderPO.getClass(),
orderDTO.getClass(), false);
beanCopier.copy(orderPO,orderDTO,null);
使用BeanCopier时,如果存在基本类型和包装类,是无法被正常拷贝,改为相同类型后才能被正常拷贝。另外,BeanCopier使用的仍然是浅拷贝。
4、Hutool BeanUtil
hutool是个人平常使用比较频繁的一个工具包,对文件、加密解密、转码、正则、线程、XML等JDK方法进行封装,并且也可以进行对象的拷贝。
使用========》BeanUtil.copyProperties(orderPO,orderDTO);
5、Mapstruct
它在编译期间就生成了 Bean属性复制的代码,运行期间就无需使用反射或者字节码技术,所以具有很高的性能。
需要额外写一个接口来实现:
@Mapper
public interface ConvertMapper {
OrderDTO po2Dto(OrderPO orderPO);
}
这里的@Mapper注解不是用于mybatis的注解,而是org.mapstruct.Mapper。
ConvertMapper mapper = Mappers.getMapper(ConvertMapper.class);
OrderDTO orderDTO=mapper.po2Dto(orderPO);
查看编译后的target目录,编译时将我们定义的ConvertMapper 接口,生成了ConvertMapperImpl实现类,并实现了po2Dto方法。
6、Dozer
Dozer是一个Bean到Bean映射器,它以递归方式将数据从一个对象复制到另一个对象,并且这些Bean可以具有不同的复杂类型。
使用=================》DozerBeanMapper mapper = new DozerBeanMapper();
OrderDTO orderDTO=mapper.map(orderPO,OrderDTO.class);
,还可以配置不同属性名称的映射,修改DTO和PO,在PO中添加一个name属性,在DTO中添加value属性:
@Data
public class OrderPO {
Integer id;
String orderNumber;
List<String> proId;
String name;
}
@Data
public class OrderDTO {
int id;
String orderNumber;
List<String> proId;
String value;
}
新建一个配置文件,在mapping中可以添加字段的映射关系:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping>
<class-a>com.cn.entity.OrderPO</class-a>
<class-b>com.cn.entity.OrderDTO</class-b>
<field>
<a>name</a>
<b>value</b>
</field>
</mapping>
</mappings>
DozerBeanMapper使用上面的配置文件进行配置,再次拷贝对象:
...
orderPO.setName("hydra");
DozerBeanMapper mapper = new DozerBeanMapper();
List<String> mappingFiles = new ArrayList<>();
mappingFiles.add("dozer.xml");
mapper.setMappingFiles(mappingFiles);
OrderDTO orderDTO=mapper.map(orderPO,OrderDTO.class);
查看测试结果,不同名称的字段也可以进行拷贝了:
OrderPO(id=1, orderNumber=orderNumber, proId=[1, 2], name=hydra)
OrderDTO(id=1, orderNumber=orderNumber, proId=[1, 2], value=hydra)
如果业务场景中的Bean具有很多不同的属性,这么配置起来还是很麻烦的,需要额外手写很多xml文件。以上就是工作中常被接触到的几种对象拷贝工具,在具体的使用中,更多的要结合拷贝效率等要求,以及工作场景中需要使用的是深拷贝还是浅拷贝等诸多因素。
Bean拷贝工具的更多相关文章
- [性能] Bean拷贝工具类性能比较
Bean拷贝工具类性能比较 引言 几年前做过一个项目,接入新的api接口.为了和api实现解耦,决定将api返回的实体类在本地也建一个.这样做有两个好处 可以在api变更字段的时候保持应用稳定性 可以 ...
- 就因为加了Lombok的@Accessors(chain = true),bean拷贝工具类不干活了
前言 这次新建了一个工程,因为 Lombok 用得很习惯,但以前的话,一般只用了@Data,@AllArgsConstructor,@EqualsAndHashCode等常规注解:那这个Accesso ...
- Java Bean拷贝工具Orika原理解析
最近面试被问及对象拷贝怎样才能高效,实际上问的就是Orika或者BeanCopier的原理.由于网上对Orika原理的解析并不太多-因此本文重点讲解一下Orika的原理.(Orika是基于JavaBe ...
- java bean属性拷贝工具类比对(性能+功能)
业务系统中经常需要两个对象进行属性的拷贝,不能否认逐个的对象拷贝是最快速最安全的做法,但是当数据对象的属性字段数量超过程序员的容忍的程度比如通常超过5个属性的时候,代码因此变得臃肿不堪,使用一些方便的 ...
- 对象属性拷贝工具类大全==>Bean的属性拷贝从此不用愁
大家在做java开发时,肯定会遇到api层参数对象传递给服务层,或者把service层的对象传递给dao层,他们之间又不是同一个类型对象,但字段又是一样,如果还是用普通的get.set方式来处理话,比 ...
- 使用CGlib实现Bean拷贝(BeanCopier)
在做业务的时候,我们有时为了隔离变化,会将DAO查询出来的Entity,和对外提供的DTO隔离开来.大概90%的时候,它们的结构都是类似的,但是我们很不喜欢写很多冗长的b.setF1(a.getF1( ...
- 常见Bean映射工具分析评测及Orika介绍
原地址:http://tech.dianwoda.com/2017/11/04/gao-xing-neng-te-xing-feng-fu-de-beanying-she-gong-ju-orika/ ...
- Bean映射工具之Apache BeanUtils VS Spring BeanUtils
背景 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进 ...
- cglib、orika、spring等bean copy工具性能测试和原理分析
简介 在实际项目中,考虑到不同的数据使用者,我们经常要处理 VO.DTO.Entity.DO 等对象的转换,如果手动编写 setter/getter 方法一个个赋值,将非常繁琐且难维护.通常情况下,这 ...
随机推荐
- C语言中的字节对齐
下面这个篇博客讲解很好 http://blog.csdn.net/meegomeego/article/details/9393783 总的来看分三类: 1. 不加 #pragma pack(n)伪指 ...
- 巩固javawbe第二天
巩固内容: <!DOCTYPE> 声明 <!DOCTYPE>声明有助于浏览器中正确显示网页. 网络上有很多不同的文件,如果能够正确声明HTML的版本,浏览器就能正确显示网页内容 ...
- Yarn的Tool接口案例
目录 Yarn的Tool接口案例 Tool接口环境准备 1 新建Maven项目YarnDemo 编写代码 打包jar上传到集群 Yarn的Tool接口案例 Tool接口环境准备 之前写wordcoun ...
- Android数据存取
Android数据存取 一.SharedPreferencesc存取数据 SharedPreferences是使用键值对的方式来存储数据的,也就是在保存一条数据时,需要给这条数据提供一个对应的键,这样 ...
- Linux学习 - IP地址配置
1 首先选择桥接模式 2 配置IP.子网掩码.网关.DNS setup 本例中使用的是无线网连接, IP地址: 192.168.3.195 子网掩码: 255.255.255.0 网关: 192. ...
- AOP中环绕通知的写法
package com.hope.utils;import org.aspectj.lang.ProceedingJoinPoint;/** * @author newcityman * @date ...
- 使用缓冲流和byte数组,拷贝文件
package com.itcast.demo05.Buffered;import java.io.*;/** * @author newcityman * @date 2019/7/28 - 17: ...
- .NET6使用DOCFX自动生成开发文档
本文内容来自我写的开源电子书<WoW C#>,现在正在编写中,可以去WOW-Csharp/学习路径总结.md at master · sogeisetsu/WOW-Csharp (gith ...
- 『与善仁』Appium基础 — 21、元素的基本操作
目录 1.元素的基本操作说明 (1)点击操作 (2)清空操作 (3)输入操作 2.综合练习 1.元素的基本操作说明 (1)点击操作 点击操作:click()方法.(同Selenium中使用方式一致) ...
- Python pyecharts绘制水球图
一.水球图Liquid.add()方法简介 Liquid.add()方法签名add(name, data, shape='circle', liquid_color=None, is_liquid_a ...