BeanCopier完成对象Copy

在做业务的时候,我们有时为了隔离变化,会将DAO查询出来的Entity,和对外提供的DTO隔离开来。大概90%的时候,它们的结构都是类似的,但是我们很不喜欢写很多冗长的b.setF1(a.getF1())这样的代码,于是我们需要BeanCopier来帮助我们。

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

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

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

2、性能

BeanCopier拷贝速度快,性能瓶颈出现在创建BeanCopier实例的过程中。所以,把创建过的BeanCopier实例放到缓存中,下次可以直接获取,提升性能。

3、代码

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();
  }

4、参考资料

转载于:https://my.oschina.net/u/1425545/blog/799346

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值