• 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文件。以上就是工作中常被接触到的几种对象拷贝工具,在具体的使用中,更多的要结合拷贝效率等要求,以及工作场景中需要使用的是深拷贝还是浅拷贝等诸多因素。

  • 相关阅读:
    研究生毕业论文如何选题
    关于虚拟机中开vmnet1(host)后pc不能上网的问题解决
    ubuntu10.04安装x264库
    CentOS 5.5无法识别Atheros AR8151网卡问题解决
    dm365工作笔记20130731
    DAVINCI DM365-DM368开发攻略——U-BOOT-2010.12及UBL的移植
    SQL语法练习
    T-SQL查询语句常用优化技巧总结
    【转】Asp.net控件开发学习笔记整理篇
    【转】Asp.net控件开发学习笔记整理篇
  • 原文地址:https://www.cnblogs.com/KL2016/p/15657460.html
Copyright © 2020-2023  润新知