乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      基于 asm 實(shí)現(xiàn)比 spring BeanUtils 性能更好的屬性拷貝框架

       python_lover 2020-02-18

      Bean-Mapping

      日常開發(fā)中經(jīng)常需要將一個對象的屬性,賦值到另一個對象中。

      常見的工具有很多,但都多少不夠簡潔,要么不夠強(qiáng)大。

      我們經(jīng)常使用的 Spring BeanUtils 性能較好,但是特性不足。

      Bean-Mapping 提供了很多豐富的特性,便于日常開發(fā)。

      如果你追求更加極致的性能,可以考慮使用 asm 實(shí)現(xiàn)的模塊,該實(shí)現(xiàn)性能優(yōu)于 spring BeanUtils 35% 左右。

      特性

      • 支持對象屬性的淺拷貝
      • 支持不同名稱字段的指定賦值
      • 支持自定義字段屬性賦值的條件,比如目標(biāo)字段不為 null 才進(jìn)行賦值
      • 支持自定義字段值轉(zhuǎn)換,可以轉(zhuǎn)換為其他類型,或者相同類型
      • 支持屬性字段為【對象】【集合】【數(shù)組】的賦值,對象賦值更加方便。
      • 支持基于 asm 實(shí)現(xiàn)的高性能復(fù)制

      快速開始

      準(zhǔn)備

      JDK1.7 及其以上版本

      Maven 3.X 及其以上版本

      maven 項目依賴

      <dependency>
          <groupId>com.github.houbb</groupId>
          <artifactId>bean-mapping-core</artifactId>
          <version>0.2.5</version>
      </dependency>

      核心類說明

      BeanUtil

      提供一個簡單的靜態(tài)方法 copyProperties。

      /**
       * 復(fù)制屬性
       * 將 source 中的賦值給 target 中名稱相同,且可以賦值的類型中去。類似于 spring 的 BeanUtils。
       * @param source 原始對象
       * @param target 目標(biāo)對象
       */
      public static void copyProperties(final Object source, Object target)

      測試代碼參考

      詳情參見 bean-mapping-test 模塊下的測試代碼。

      示例代碼

      對象的定義

      • BaseSource.java & BaseTarget.java

      其中 BaseSource 對象和 BaseTarget 對象的屬性是相同的。

      public class BaseSource {
      
          /**
           * 名稱
           */
          private String name;
      
          /**
           * 年齡
           */
          private int age;
      
          /**
           * 生日
           */
          private Date birthday;
      
          /**
           * 字符串列表
           */
          private List<String> stringList;
          
          //getter & setter
      }

      屬性賦值測試案例

      我們構(gòu)建 BaseSource 的屬性,然后調(diào)用

      BeanUtil.copyProperties(baseSource, baseTarget);

      類似于 spring BeanUtils 和 Apache BeanUtils,并驗證結(jié)果符合我們的預(yù)期。

          /**
           * 基礎(chǔ)測試
           */
          @Test
          public void baseTest() {
              BaseSource baseSource = buildBaseSource();
              BaseTarget baseTarget = new BaseTarget();
              BeanUtil.copyProperties(baseSource, baseTarget);
      
              // 斷言賦值后的屬性和原來相同
              Assertions.assertEquals(baseSource.getAge(), baseTarget.getAge());
              Assertions.assertEquals(baseSource.getName(), baseTarget.getName());
              Assertions.assertEquals(baseSource.getBirthday(), baseTarget.getBirthday());
              Assertions.assertEquals(baseSource.getStringList(), baseTarget.getStringList());
          }
      
          /**
           * 構(gòu)建用戶信息
           * @return 用戶
           */
          private BaseSource buildBaseSource() {
              BaseSource baseSource = new BaseSource();
              baseSource.setAge(10);
              baseSource.setName("映射測試");
              baseSource.setBirthday(new Date());
              baseSource.setStringList(Arrays.asList("1", "2"));
              return baseSource;
          }

      asm 復(fù)制

      簡介

      有時候我們對于性能要求較高,而對便利性要求沒有這么高。

      本框架也提供了基于 asm 的復(fù)制方式,性能比 spring 好 35% 左右。

      見文末的 benchmark。

      maven 引入

      <dependency>
          <groupId>com.github.houbb</groupId>
          <artifactId>bean-mapping-asm</artifactId>
          <version>0.2.5</version>
      </dependency>

      測試代碼

      BeanUtil#copyProperties(Object, Object) 使用類似,但是暫時不支持注解等更加豐富的功能。

      BaseSource baseSource = buildBaseSource();
      BaseTarget baseTarget = new BaseTarget();
      AsmBeanUtil.copyProperties(baseSource, baseTarget);

      拓展閱讀

      實(shí)際工作中,我們遇到的情況會比這個復(fù)雜一些。

      比如兩個字段名稱不同,我們也想進(jìn)行賦值,值得處理轉(zhuǎn)換等等。

      深入學(xué)習(xí)

      Bean-Mapping 相關(guān)文檔:

      01-項目模塊簡介和預(yù)期功能

      02-BeanMapping 注解的引入

      03-不同名稱字段的指定賦值

      04-自定義賦值生效的條件

      05-自定義字段轉(zhuǎn)換實(shí)現(xiàn)

      06-支持屬性字段為【對象】【集合】【數(shù)組】的賦值

      07-BeanUtil#copyProperties(Object, Class) 方法

      性能

      對比圖

      benchmark

      可見框架默認(rèn) bean-mapping 實(shí)現(xiàn)性能一般,涉及到了太多的特性,導(dǎo)致復(fù)制性能略低于 spring。

      基于 reflectasm 實(shí)現(xiàn)的 asm-bean-mapping 的性能高于 spring。

      代碼示例參見 BeanUtilBeanchmarkTest.java

      展望

      相對 BeanCopier 這種實(shí)現(xiàn)方式,我們的實(shí)現(xiàn)方式性能還是有很大提升空間。

      后期可以考慮實(shí)現(xiàn)類似 BeanCopier 的方式。

      開源地址

      這個框架的源代碼全部開源,也便于我們學(xué)習(xí)。

      Bean-Mapping

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多