BeanCopier完成对象Copy

在作业务的时候,咱们有时为了隔离变化,会将DAO查询出来的Entity,和对外提供的DTO隔离开来。大概90%的时候,它们的结构都是相似的,可是咱们很不喜欢写不少冗长的b.setF1(a.getF1())这样的代码,因而咱们须要BeanCopier来帮助咱们。java

一、使用Cglib的BeanCopier完成bean对象拷贝

条件 结果
1 属性名相同,而且属性类型相同 ok
2 属性名相同,而且属性类型不相同 no
2 target的setter不规范 抛异常

注意:即便源类型是原始类型(int, short和char等),目标类型是其包装类型(Integer, Short和Character等),或反之:都不会被拷贝。缓存

二、性能

BeanCopier拷贝速度快,性能瓶颈出如今建立BeanCopier实例的过程当中。因此,把建立过的BeanCopier实例放到缓存中,下次能够直接获取,提高性能。性能

三、代码

static final Map<String, BeanCopier> BEAN_COPIERS = new HashMap<String, BeanCopier>();

  public static void copy(Object from, Object to, Converter converter) {
      String key = genKey(from.getClass(), to.getClass());
      boolean isConvert = false;
      if (converter != null) {
          isConvert = true;
      }
      BeanCopier copier = null;
      synchronized (BeanCopierUtils.class) {
          if (!BEAN_COPIERS.containsKey(key)) {
              copier = BeanCopier.create(from.getClass(), to.getClass(), isConvert);
          } else {
              copier = BEAN_COPIERS.get(key);
          }
      }
      copier.copy(from, to, converter);
  }

  private static String genKey(Class<?> srcClazz, Class<?> destClazz) {
      return srcClazz.getName() + destClazz.getName();
  }

四、参考资料

相关文章
相关标签/搜索