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

四、參考資料

相關文章
相關標籤/搜索