Dozer
Dozer ,中文直译为挖土机 ,这是一个「重量级」属性复制工具类,相比于上面介绍三个工具类,Dozer 具有很多强大的功能。
官网 logo
画外音:重量级/轻量级其实只是一个相对的说法,由于 Dozer 相对 BeanUtils 这类工具类来说,拥有许多高级功能,所以相对来说这是一个重量级工具类。
阿粉刚碰到这个工具类,就被深深折服,真的太强大了,上面我们期望的功能,Dozer 都给你实现了。
下面我们来看下使用方法,首先我们引入 Dozer 依赖:
<dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.4.0</version> </dependency>
使用方法如下:
// 省略属性的代码 DozerBeanMapper mapper = new DozerBeanMapper(); StudentDO studentDO = mapper.map(studentDTO, StudentDO.class); System.out.println(studentDO);
Dozer 需要我们新建一个DozerBeanMapper
,这个类作用等同与 BeanUtils,负责对象之间的映射,属性复制。
画外音:下面的代码我们可以看到,生成
DozerBeanMapper
实例需要加载配置文件,随意生成代价比较高。在我们应用程序中,应该使用单例模式,重复使用DozerBeanMapper
。
如果属性都是一些简单基本类型,那我们只要使用上面代码,可以快速完成属性复制。
不过很不幸,我们的代码中有字符串与 Date 类型转化,如果我们直接使用上面的代码,程序运行将会抛出异常。
所以这里我们要用到 Dozer 强大的配置功能,我们总共可以使用下面三种方式:
- XML
- API
- 注解
其中,API 的方式比较繁琐,目前大部分使用 XML 进行,另外注解功能的是在 Dozer 5.3.2 之后增加的新功能,不过功能相较于 XML 来说较弱。
XML 使用方式
下面我们使用 XML 配置方式,配置 DTO 与 DO 关系,首先我们新建一个 dozer/dozer-mapping.xml
文件:
<?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 date-format="yyyy-MM-dd HH:mm:ss"> <class-a>com.just.doone.example.domain.StudentDTO</class-a> <class-b>com.just.doone.example.domain.StudentDO</class-b> <!-- 在下面指定字段名不一致的映射关系 --> <field> <a>no</a> <b>number</b> </field> <field> <!-- 字段级别的日期转换,将会覆盖字段上的转换 --> <a date-format="yy-MM-dd">createDate</a> <b>createDate</b> </field> </mapping> </mappings>
然后修改我们的 Java 代码,增加读取 Dozer 的配置文件:
DozerBeanMapper mapper = new DozerBeanMapper(); List<String> mappingFiles = new ArrayList<>(); // 读取配置文件 mappingFiles.add("dozer/dozer-mapping.xml"); mapper.setMappingFiles(mappingFiles); StudentDO studentDO = mapper.map(studentDTO, StudentDO.class); System.out.println(studentDO);
运行之后,对比studentDO
与 studentDTO
对象:
从上面的图我们可以发现:
- 类型不一致的字段,属性被复制
- DO 与 DTO 对象字段不是同一个对象,也就是深拷贝
- 通过配置字段名的映射关系,不一样字段的属性也被复制
除了上述这些相对简单的属性以外,Dozer 还支持很多额外的功能,比如枚举属性复制,Map 等集合属性复制等。
有些小伙伴刚看到 Dozer 的用法,可能觉得这个工具类比较繁琐,不像 BeanUtils 工具类一样一行代码就可以解。
其实 Dozer 可以很好跟 Spring 框架整合,我们可以在 Spring 配置文件提前配置,后续我们只要引用 Dozer 的相应的 Bean ,使用方式也是一行代码。