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


朵小喵儿|七种对象复制工具类,你最看好哪个?为了解决这个问题 , 我们需要自己构造一个 Converter 转换类 , 然后使用 ConvertUtils注册 , 使用方法如下:
ConvertUtils.register(new Converter() {@SneakyThrows@Overridepublic Date convert(Class type, Object value) {if (value =http://kandian.youth.cn/index/= null) {return null;}if (value instanceof String) {String str = (String) value;return (Date) DateUtils.parseDate(str,"yyyy-MM-dd");}return null;}}, Date.class);此时 , 我们观察 studentDO与 studentDTO对象属性值:
朵小喵儿|七种对象复制工具类,你最看好哪个?从上面的图我们可以得出BeanUtils一些结论:

  • 普通字段名不一致的属性无法被复制
  • 嵌套对象字段 , 将会与源对象使用同一对象 , 即使用浅拷贝
  • 类型不一致的字段 , 将会进行默认类型转化 。
虽然 BeanUtils 使用起来很方便 , 不过其底层源码为了追求完美 , 加了过多的包装 , 使用了很多反射 , 做了很多校验 , 所以导致性能较差 , 所以在阿里巴巴开发手册上强制规定避免使用它Apache BeanUtils 。
朵小喵儿|七种对象复制工具类,你最看好哪个?image-20200818222213879
Spring BeanUtilsSpring 属性复制工具类类名与 Apache 一样 , 基本用法也差不多 。 我先来看下 SpringBeanUtils 基本用法 。
同样 , 我们先引入依赖 , 从名字我们可以看出 , BeanUtils 位于 Spring-Beans 模块 , 这里我们依然使用最新模块 。
org.springframeworkspring-beans5.2.8.RELEASE这里我们使用 DTO 与 DO 复用上面的例子 , 转换代码如下:
// 省略上面赋值代码 , 与上面一致StudentDO studentDO = new StudentDO();BeanUtils.copyProperties(studentDTO, studentDO);从用法可以看到 , Spring BeanUtils 与 Apache 有一个最大的不同 , 两者源对象与目标对象参数位置不一样 , 阿粉之前没注意 , 用了 Spring 工具类 , 但是却是按照 Apache 的用法使用 。
此时对比studentDO与 studentDTO对象:
朵小喵儿|七种对象复制工具类,你最看好哪个?从上面的对比图我们可以得到一些结论:
  • 字段名不一致 , 属性无法复制
  • 类型不一致 , 属性无法复制 。 但是注意 , 如果类型为基本类型以及基本类型的包装类 , 这种可以转化
  • 嵌套对象字段 , 将会与源对象使用同一对象 , 即使用浅拷贝
除了这个方法之外 , Spring BeanUtils 还提供了一个重载方法:
public static void copyProperties(Object source, Object target, String... ignoreProperties) 使用这个方法 , 我们可以忽略某些不想被复制过去的属性:
BeanUtils.copyProperties(studentDTO, studentDO,"name");这样 , name 属性就不会被复制到 DO 对象中 。
朵小喵儿|七种对象复制工具类,你最看好哪个?虽然 Spring BeanUtils 与 Apache BeanUtils 功能差不多 , 但是在性能上 Spring BeanUtils 还是完爆 Apache BeanUtils 。 主要原因还是在于 Spring 并没有与 Apache 一样使用反射做了过多校验 , 另外 Spring BeanUtils 内部使用了缓存 , 加快转换的速度 。


推荐阅读