中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

為什么禁止使用Apache Beanutils進行屬性的copy

發布時間:2021-10-28 15:43:36 來源:億速云 閱讀:184 作者:iii 欄目:編程語言

這篇文章主要講解了“為什么禁止使用Apache Beanutils進行屬性的copy”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“為什么禁止使用Apache Beanutils進行屬性的copy”吧!

性能對比

No Data No BB,我們就來寫代碼來對比下這幾種框架的性能情況。

代碼示例如下:

首先定義一個PersonDO類:

public class PersonDO {      private Integer id;      private String name;      private Integer age;      private Date birthday;      //省略setter/getter  }

再定義一個PersonDTO類:

public class PersonDTO {      private String name;      private Integer age;      private Date birthday;  }

然后進行測試類的編寫:

使用Spring BeanUtils進行屬性拷貝:

private void mappingBySpringBeanUtils(PersonDO personDO, int times) {      StopWatch stopwatch = new StopWatch();      stopwatch.start();      for (int i = 0; i < times; i++) {          PersonDTO personDTO = new PersonDTO();          org.springframework.beans.BeanUtils.copyProperties(personDO, personDTO);      }      stopwatch.stop();      System.out.println("mappingBySpringBeanUtils cost :" + stopwatch.getTotalTimeMillis());  }

其中的StopWatch用于記錄代碼執行時間,方便進行對比。

使用Cglib BeanCopier進行屬性拷貝:

private void mappingByCglibBeanCopier(PersonDO personDO, int times) {      StopWatch stopwatch = new StopWatch();      stopwatch.start();      for (int i = 0; i < times; i++) {          PersonDTO personDTO = new PersonDTO();          BeanCopier copier = BeanCopier.create(PersonDO.class, PersonDTO.class, false);          copier.copy(personDO, personDTO, null);      }      stopwatch.stop();      System.out.println("mappingByCglibBeanCopier cost :" + stopwatch.getTotalTimeMillis());  }

使用Apache BeanUtils進行屬性拷貝:

private void mappingByApacheBeanUtils(PersonDO personDO, int times)      throws InvocationTargetException, IllegalAccessException {      StopWatch stopwatch = new StopWatch();      stopwatch.start();      for (int i = 0; i < times; i++) {          PersonDTO personDTO = new PersonDTO();          BeanUtils.copyProperties(personDTO, personDO);      }      stopwatch.stop();      System.out.println("mappingByApacheBeanUtils cost :" + stopwatch.getTotalTimeMillis());  }

使用Apache PropertyUtils進行屬性拷貝:

private void mappingByApachePropertyUtils(PersonDO personDO, int times)      throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {      StopWatch stopwatch = new StopWatch();      stopwatch.start();      for (int i = 0; i < times; i++) {          PersonDTO personDTO = new PersonDTO();          PropertyUtils.copyProperties(personDTO, personDO);      }      stopwatch.stop();      System.out.println("mappingByApachePropertyUtils cost :" + stopwatch.getTotalTimeMillis());  }

然后執行以下代碼:

public static void main(String[] args)      throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {      PersonDO personDO = new PersonDO();      personDO.setName("Hollis");      personDO.setAge(26);      personDO.setBirthday(new Date());      personDO.setId(1);      MapperTest mapperTest = new MapperTest();      mapperTest.mappingBySpringBeanUtils(personDO, 100);     mapperTest.mappingBySpringBeanUtils(personDO, 1000);      mapperTest.mappingBySpringBeanUtils(personDO, 10000);      mapperTest.mappingBySpringBeanUtils(personDO, 100000);      mapperTest.mappingBySpringBeanUtils(personDO, 1000000);      mapperTest.mappingByCglibBeanCopier(personDO, 100);      mapperTest.mappingByCglibBeanCopier(personDO, 1000);      mapperTest.mappingByCglibBeanCopier(personDO, 10000);      mapperTest.mappingByCglibBeanCopier(personDO, 100000);      mapperTest.mappingByCglibBeanCopier(personDO, 1000000);      mapperTest.mappingByApachePropertyUtils(personDO, 100);      mapperTest.mappingByApachePropertyUtils(personDO, 1000);      mapperTest.mappingByApachePropertyUtils(personDO, 10000);      mapperTest.mappingByApachePropertyUtils(personDO, 100000);      mapperTest.mappingByApachePropertyUtils(personDO, 1000000);      mapperTest.mappingByApacheBeanUtils(personDO, 100);      mapperTest.mappingByApacheBeanUtils(personDO, 1000);      mapperTest.mappingByApacheBeanUtils(personDO, 10000);      mapperTest.mappingByApacheBeanUtils(personDO, 100000);      mapperTest.mappingByApacheBeanUtils(personDO, 1000000); }

得到結果如下:

工具類執行1000次耗時執行10000次耗時執行100000次耗時執行1000000次耗時
Spring BeanUtils5ms10ms45ms169ms
Cglib BeanCopier4ms18ms45ms91ms
Apache PropertyUtils60ms265ms1444ms11492ms
Apache BeanUtils138ms816ms4154ms36938ms
Dozer566ms2254ms11136ms102965ms

畫了一張折線圖更方便大家進行對比

為什么禁止使用Apache Beanutils進行屬性的copy

綜上,我們基本可以得出結論,在性能方面,Spring BeanUtils和Cglib BeanCopier表現比較不錯,而Apache PropertyUtils、Apache BeanUtils以及Dozer則表現的很不好。

所以,如果考慮性能情況的話,建議大家不要選擇Apache PropertyUtils、Apache BeanUtils以及Dozer等工具類。

很多人會不理解,為什么大名鼎鼎的Apache開源出來的的類庫性能確不高呢?這不像是Apache的風格呀,這背后導致性能低下的原因又是什么呢?

其實,是因為Apache BeanUtils力求做得完美, 在代碼中增加了非常多的校驗、兼容、日志打印等代碼,過度的包裝導致性能下降嚴重。

感謝各位的閱讀,以上就是“為什么禁止使用Apache Beanutils進行屬性的copy”的內容了,經過本文的學習后,相信大家對為什么禁止使用Apache Beanutils進行屬性的copy這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临清市| 永善县| 河津市| 上栗县| 延长县| 龙里县| 新余市| 澳门| 江北区| 宁德市| 祥云县| 安庆市| 万州区| 中宁县| 四平市| 鹤壁市| 夏河县| 疏勒县| 安国市| 沁阳市| 松溪县| 玉环县| 福鼎市| 枞阳县| 龙江县| 洛川县| 姚安县| 嘉禾县| 定南县| 中西区| 峨山| 石阡县| 祁东县| 富裕县| 福贡县| 泰安市| 吴忠市| 当阳市| 工布江达县| 义乌市| 始兴县|