朵小喵儿|七种对象复制工具类,你最看好哪个?( 四 )


阿粉刚碰到这个工具类 , 就被深深折服 , 真的太强大了 , 上面我们期望的功能 , Dozer 都给你实现了 。
下面我们来看下使用方法 , 首先我们引入 Dozer 依赖:
net.sf.dozerdozer5.4.0使用方法如下:
// 省略属性的代码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 文件:
com.just.doone.example.domain.StudentDTOcom.just.doone.example.domain.StudentDOnonumbercreateDatecreateDate然后修改我们的 Java 代码,增加读取 Dozer 的配置文件:
DozerBeanMapper mapper = new DozerBeanMapper();List 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 工具类一样一行代码就可以解 。


推荐阅读