精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么阿里巴巴禁止使用Apache Beanutils進行屬性的copy?

開發 后端
在日常開發中,我們經常需要給對象進行賦值,通常會調用其set/get方法,有些時候,如果我們要轉換的兩個對象之間屬性大致相同,會考慮使用屬性拷貝工具進行

[[341294]]

 在日常開發中,我們經常需要給對象進行賦值,通常會調用其set/get方法,有些時候,如果我們要轉換的兩個對象之間屬性大致相同,會考慮使用屬性拷貝工具進行。

如我們經常在代碼中會對一個數據結構封裝成DO、SDO、DTO、VO等,而這些Bean中的大部分屬性都是一樣的,所以使用屬性拷貝類工具可以幫助我們節省大量的set和get操作。

市面上有很多類似的工具類,比較常用的有

1、Spring BeanUtils 

2、Cglib BeanCopier 

3、Apache BeanUtils 

4、Apache PropertyUtils 

5、Dozer

那么,我們到底應該選擇哪種工具類更加合適呢?為什么阿里巴巴Java開發手冊中提到禁止使用Apache BeanUtils呢?

由于篇幅優先,關于這幾種工具類的用法及區別,還有到底是什么是淺拷貝和深拷貝不在本文的討論范圍內。

本文主要聚焦于對比這幾個類庫的性能問題。

性能對比

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

代碼示例如下:

首先定義一個PersonDO類: 

  1. public class PersonDO {  
  2.     private Integer id;  
  3.     private String name;  
  4.     private Integer age;  
  5.     private Date birthday;  
  6.     //省略setter/getter  

再定義一個PersonDTO類: 

  1. public class PersonDTO {  
  2.     private String name;  
  3.     private Integer age;  
  4.     private Date birthday;  

然后進行測試類的編寫:

使用Spring BeanUtils進行屬性拷貝: 

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

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

使用Cglib BeanCopier進行屬性拷貝: 

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

使用Apache BeanUtils進行屬性拷貝: 

  1. private void mappingByApacheBeanUtils(PersonDO personDO, int times)  
  2.     throws InvocationTargetException, IllegalAccessException {  
  3.     StopWatch stopwatch = new StopWatch();  
  4.     stopwatch.start();  
  5.     for (int i = 0; i < times; i++) {  
  6.         PersonDTO personDTO = new PersonDTO();  
  7.         BeanUtils.copyProperties(personDTO, personDO);  
  8.     }  
  9.     stopwatch.stop();  
  10.     System.out.println("mappingByApacheBeanUtils cost :" + stopwatch.getTotalTimeMillis());  

使用Apache PropertyUtils進行屬性拷貝: 

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

然后執行以下代碼: 

  1. public static void main(String[] args)  
  2.     throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {  
  3.     PersonDO personDO = new PersonDO();  
  4.     personDO.setName("Hollis");  
  5.     personDO.setAge(26);  
  6.     personDO.setBirthday(new Date());  
  7.     personDO.setId(1);  
  8.     MapperTest mapperTest = new MapperTest();  
  9.     mapperTest.mappingBySpringBeanUtils(personDO, 100); 
  10.     mapperTest.mappingBySpringBeanUtils(personDO, 1000);  
  11.     mapperTest.mappingBySpringBeanUtils(personDO, 10000);  
  12.     mapperTest.mappingBySpringBeanUtils(personDO, 100000);  
  13.     mapperTest.mappingBySpringBeanUtils(personDO, 1000000);  
  14.     mapperTest.mappingByCglibBeanCopier(personDO, 100);  
  15.     mapperTest.mappingByCglibBeanCopier(personDO, 1000);  
  16.     mapperTest.mappingByCglibBeanCopier(personDO, 10000);  
  17.     mapperTest.mappingByCglibBeanCopier(personDO, 100000);  
  18.     mapperTest.mappingByCglibBeanCopier(personDO, 1000000);  
  19.     mapperTest.mappingByApachePropertyUtils(personDO, 100);  
  20.     mapperTest.mappingByApachePropertyUtils(personDO, 1000);  
  21.     mapperTest.mappingByApachePropertyUtils(personDO, 10000);  
  22.     mapperTest.mappingByApachePropertyUtils(personDO, 100000);  
  23.     mapperTest.mappingByApachePropertyUtils(personDO, 1000000);  
  24.     mapperTest.mappingByApacheBeanUtils(personDO, 100);  
  25.     mapperTest.mappingByApacheBeanUtils(personDO, 1000);  
  26.     mapperTest.mappingByApacheBeanUtils(personDO, 10000);  
  27.     mapperTest.mappingByApacheBeanUtils(personDO, 100000);  
  28.     mapperTest.mappingByApacheBeanUtils(personDO, 1000000); 

得到結果如下:

工具類 執行1000次耗時 執行10000次耗時 執行100000次耗時 執行1000000次耗時
Spring BeanUtils 5ms 10ms 45ms 169ms
Cglib BeanCopier 4ms 18ms 45ms 91ms
Apache PropertyUtils 60ms 265ms 1444ms 11492ms
Apache BeanUtils 138ms 816ms 4154ms 36938ms
Dozer 566ms 2254ms 11136ms 102965ms

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

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

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

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

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

總結

本文通過對比幾種常見的屬性拷貝的類庫,分析得出了這些工具類的性能情況,最終也驗證了《阿里巴巴Java開發手冊》中提到的"Apache BeanUtils 效率低"的事實。

但是本文只是站在性能這一單一角度進行了對比,我們在選擇一個工具類的時候還會有其他方面的考慮,比如使用成本、理解難度、兼容性、可擴展性等,對于這種拷貝類工具類,我們還會考慮其功能是否完善等。

就像雖然Dozer性能比較差,但是他可以很好的和Spring結合,可以通過配置文件等進行屬性之間的映射等,也受到了很多開發者的喜愛。

本文用到的第三方類庫的maven依賴如下: 

  1. <!--Apache PropertyUtils、Apache BeanUtils-->  
  2. <dependency>  
  3.     <groupId>commons-beanutils</groupId>  
  4.     <artifactId>commons-beanutils</artifactId>  
  5.     <version>1.9.4</version>  
  6. </dependency> 
  7. <dependency>  
  8.     <groupId>commons-logging</groupId>  
  9.     <artifactId>commons-logging</artifactId>  
  10.     <version>1.1.2</version>  
  11. </dependency>  
  12. <!--Spring PropertyUtils-->  
  13. <dependency>  
  14.     <groupId>org.springframework</groupId>  
  15.     <artifactId>org.springframework.beans</artifactId>  
  16.     <version>3.1.1.RELEASE</version> 
  17. </dependency>  
  18. <!--cglib-->  
  19. <dependency>  
  20.     <groupId>cglib</groupId>  
  21.     <artifactId>cglib-nodep</artifactId>  
  22.     <version>2.2.2</version>  
  23. </dependency>  
  24. <!--dozer-->  
  25. <dependency>  
  26.     <groupId>net.sf.dozer</groupId>  
  27.     <artifactId>dozer</artifactId>  
  28.     <version>5.5.1</version>  
  29. </dependency>  
  30. <!--日志相關-->  
  31. <dependency>  
  32.     <groupId>org.slf4j</groupId>  
  33.     <artifactId>slf4j-api</artifactId>  
  34.     <version>1.7.7</version>  
  35. </dependency>  
  36. <dependency> 
  37.     <groupId>org.slf4j</groupId>  
  38.     <artifactId>jul-to-slf4j</artifactId>  
  39.     <version>1.7.7</version>  
  40. </dependency>  
  41. <dependency> 
  42.     <groupId>org.slf4j</groupId>  
  43.     <artifactId>jcl-over-slf4j</artifactId> 
  44.     <version>1.7.7</version>  
  45. </dependency>  
  46. <dependency> 
  47.     <groupId>org.slf4j</groupId>  
  48.     <artifactId>log4j-over-slf4j</artifactId>  
  49.     <version>1.7.7</version>  
  50. </dependency>  
  51. <dependency>  
  52.     <groupId>org.slf4j</groupId>  
  53.     <artifactId>slf4j-jdk14</artifactId>  
  54.     <version>1.7.7</version>  
  55. </dependency>  

 

責任編輯:龐桂玉 來源: Java編程
相關推薦

2020-07-30 12:16:33

阿里巴巴Apache對象

2023-01-11 08:06:42

對象賦值項目開發

2018-10-16 15:34:17

阿里巴巴Apache Flin大數據

2020-09-22 11:40:53

BigDecimalequalsJava

2021-10-11 09:32:40

包裝類型屬性

2019-03-04 09:22:52

阿里巴巴foreach Java

2025-04-17 08:47:23

2025-07-14 00:00:00

2022-09-05 10:06:21

MySQL外循環內循環

2021-08-04 17:20:30

阿里巴巴AsyncJava

2013-08-22 09:26:38

去IOE王堅

2019-06-26 07:54:53

ArrayListsubList源碼

2019-09-04 11:02:54

繼承層次組合

2019-09-02 15:20:28

Java開發繼承

2016-09-21 20:28:55

阿里巴巴IOE

2022-08-30 16:38:30

阿里巴巴JavaLog4j

2020-09-14 09:47:56

Java開發類型

2019-02-27 09:00:13

阿里巴巴for循環Java

2019-01-29 10:30:32

阿里巴巴Java字符串

2021-09-07 17:22:43

阿里巴巴辭職高薪
點贊
收藏

51CTO技術棧公眾號

中文字幕视频网站| 下面一进一出好爽视频| 国产在线视频网站| 日本美女视频一区二区| 亚洲一区第一页| 午夜免费福利在线| 欧美jizz18性欧美| 成人性生交大合| 日本成人激情视频| 成人一级黄色大片| 久久97久久97精品免视看秋霞| 欧美日韩性视频在线| 日韩av大全| 国产不卡精品视频| 性色一区二区| 久久国产精品久久久久| 无码国产69精品久久久久网站| 麻豆国产在线| 《视频一区视频二区| 国产伦精品一区二区三毛| 蜜臀精品一区二区三区| 亚洲成av人片乱码色午夜| 亚洲第一网站免费视频| 在线观看国产中文字幕| 变态调教一区二区三区| 欧美激情一区二区| 国产精品久久久久av福利动漫| 人妻丰满熟妇av无码区| 午夜精品影院| 日韩激情在线视频| 日韩av影视大全| sis001亚洲原创区| 最新国产精品久久精品| 蜜桃91精品入口| www.桃色av嫩草.com| 日韩成人精品在线| 性欧美xxxx交| 老熟妇高潮一区二区三区| 性欧美xxxx免费岛国不卡电影| 欧美高清视频www夜色资源网| 久久国产亚洲精品无码| a免费在线观看| 中文幕一区二区三区久久蜜桃| 91影视免费在线观看| 一级片免费在线播放| 国内精品美女在线观看| 日韩中文字幕不卡视频| 日韩网站在线播放| 97青娱国产盛宴精品视频| 欧美日韩精品一二三区| 日av中文字幕| 国产不卡网站| 欧美日韩在线免费| 青青青青草视频| 日本高清在线观看视频| 久久久久高清精品| 九9re精品视频在线观看re6| 亚洲第一视频在线| 国产福利视频一区二区三区| 国产精品一二三视频| 四虎影院在线免费播放| 亚洲一区免费| 欧美亚洲在线视频| 你懂的国产在线| 中文高清一区| 欧美亚洲国产成人精品| 五月天激情国产综合婷婷婷| 亚洲一区国产一区| 欧美壮男野外gaytube| 精品视频久久久久| 午夜日本精品| 欧美国产日本高清在线| 久久网中文字幕| 韩日视频一区| 国语自产偷拍精品视频偷| 久久综合亚洲色hezyo国产| 欧美成人中文| 色综合久久久888| 国产在线综合网| 国产精品亚洲综合久久| 国产最新精品视频| 免费观看一区二区三区毛片| 中文日韩在线| 国产精品久久久久影院日本| 波多野结衣二区三区| 免费人成在线不卡| 成人性生交大片免费看视频直播 | 99热这里只有精品在线观看| 黄页视频在线91| 91综合免费在线| 精品国产av一区二区| 成人免费三级在线| 精品国产一区二区三| 五月激情婷婷网| 日本一区二区视频在线观看| 中文有码久久| 国产精品国精产品一二| 日韩欧美成人精品| 久久久久久蜜桃一区二区| 久久国产精品免费一区二区三区| 欧美大片在线观看一区| 国产中文字幕一区二区| 久久一区二区三区喷水| 欧美黑人xxxx| 日本黄色一级视频| 国产一区二区三区精品视频| 国产青春久久久国产毛片| 加勒比一区二区三区在线| 国产日产欧美一区二区三区| 中文字幕成人一区| 爱啪啪综合导航| 欧美猛男gaygay网站| 中文字幕无码人妻少妇免费| 日韩精品电影| 国产91精品不卡视频| 97人妻精品一区二区三区| 波多野结衣在线一区| 亚洲欧美99| 华人av在线| 日韩午夜三级在线| 国产全是老熟女太爽了| 欧美福利电影在线观看| 日韩免费黄色av| 亚洲高清视频网站| 亚洲国产精品成人综合 | 黑人狂躁日本妞一区二区三区 | 免费网站看av| 日韩成人一级片| 国产视频精品网| 黄色动漫在线观看| 在线影院国内精品| 欧美丰满熟妇bbb久久久| 99久久精品网| 国产成一区二区| 五月婷婷深深爱| 一级中文字幕一区二区| 天天干天天综合| 蜜臀av免费一区二区三区| 欧美高清视频在线| 97超碰人人草| 国产精品天干天干在线综合| 丰满少妇大力进入| 亚洲精品在线播放| 久久久精品中文字幕| 日韩黄色片网站| 久久香蕉国产线看观看99| 国产va亚洲va在线va| 国产精品日韩精品在线播放| 在线丨暗呦小u女国产精品| 欧美亚洲精品天堂| 国产乱一区二区| 少妇高潮流白浆| 成人全视频在线观看在线播放高清| 欧美精品一区二区三区久久久| 日本美女黄色一级片| 免费人成网站在线观看欧美高清| 日本视频一区二区不卡| 亚洲精品动漫| 亚洲欧美在线x视频| 日韩成人高清视频| 99在线精品一区二区三区| 日韩网站在线免费观看| 成人av影音| 午夜免费久久久久| 日韩欧美在线番号| 色综合夜色一区| 91网站免费入口| 一本一道久久综合狠狠老精东影业| 国产精品一区二区三区免费观看| 亚洲七七久久综合桃花剧情介绍| 欧美一级片在线看| 久久亚洲AV无码| 成人晚上爱看视频| 色欲色香天天天综合网www| 视频一区日韩精品| 久久综合免费视频| 亚洲AV无码国产精品午夜字幕| 亚洲激情六月丁香| 国产xxxxxxxxx| 欧美资源在线| 一本一道久久久a久久久精品91 | 国内精品99| 欧美lavv| 久久亚洲精品人成综合网| 久久手机免费视频| 国产乱淫片视频| 亚洲视频免费看| 亚洲精品久久一区二区三区777| 精品二区久久| 欧美一二三区| 精品国产不卡一区二区| 亚洲91av视频| 成人激情电影在线看| 91精品婷婷国产综合久久性色| 91久久久久久久久久久久久久| 国产精品99精品久久免费| www.99热这里只有精品| 国产一区二区三区四区五区| 成人国产精品一区二区| www成人免费观看| 亚洲最新视频在线| 国内精品久久久久久久久久久| 亚洲成av人片| 亚洲AV成人无码网站天堂久久| 国产精品一区二区男女羞羞无遮挡 | 高清一区二区| 97在线观看视频国产| av在线资源站| 精品国产精品一区二区夜夜嗨| 午夜精品一区二| 亚洲最大的成人av| 欧美性猛交xxxx乱| 国产精品综合一区二区| 激情内射人妻1区2区3区| 欧美/亚洲一区| 欧美主播一区二区三区美女 久久精品人| 欧美成人xxxx| 欧美一级电影在线| 超碰在线网址| 一二美女精品欧洲| 欧美 日韩 国产 成人 在线 91| 色网站国产精品| 国产污视频在线观看| 中文字幕在线不卡| av无码av天天av天天爽| 国产精品主播直播| 欧美午夜aaaaaa免费视频| 亚洲国产精品第一区二区| 免费av在线一区二区| 粉嫩av一区二区| 91天堂在线观看| 国产精品久久久久77777丨| 久久久伊人日本| 超碰在线无需免费| 日韩色av导航| 97最新国自产拍视频在线完整在线看| 亚洲精品福利视频| 免费观看黄色av| 日韩免费一区二区| 在线免费av网| 91成人免费电影| 国内自拍视频在线播放| 亚洲成人在线网站| 久久久久久久久久久久久久久久久| 国产精品久久久爽爽爽麻豆色哟哟| 国产国语老龄妇女a片| 国产成人免费视频网站| 国产精品探花在线播放| 久久99国产精品尤物| www日韩在线观看| 久久久久久久高潮| 欧美国产激情视频| 模特精品在线| 蜜臀久久99精品久久久酒店新书| 午夜在线一区| 波多野结衣家庭教师在线播放| 亚洲经典在线看| 国产av国片精品| 女生裸体视频一区二区三区| www亚洲国产| 婷婷综合久久| 永久免费网站视频在线观看| 亚洲国产精品日韩专区av有中文| 天堂资源在线亚洲资源| 日韩三级在线| 在线视频一区观看| 欧美精品国产| 妞干网在线观看视频| 亚洲深夜激情| 日韩中文字幕免费在线| 日韩黄色免费网站| 亚洲精品20p| 激情文学综合丁香| 永久av免费在线观看| 成人妖精视频yjsp地址| 亚洲精品女人久久久| 久久亚洲一级片| 国产日产在线观看| 亚洲免费电影在线| 久久久一二三区| 日韩欧美中文第一页| 波多野结衣爱爱| 91精品国产综合久久婷婷香蕉| 国产人妻精品一区二区三区| 日韩欧美成人激情| 噜噜噜久久,亚洲精品国产品| 日韩hd视频在线观看| 国内精品在线视频| 中文字幕亚洲色图| av色综合久久天堂av色综合在| 久久久久久久亚洲精品| 欧美大片免费| 96pao国产成视频永久免费| 国产suv精品一区| 人禽交欧美网站免费| 亚洲不卡av不卡一区二区| 法国空姐在线观看免费| 一本色道久久综合亚洲精品不| 成人性视频欧美一区二区三区| 久久国产剧场电影| 国产精品扒开腿做爽爽爽a片唱戏| 2023国产精品视频| 欧美特级一级片| 欧美日韩免费一区| 一区二区三区亚洲视频| 亚洲国产成人在线视频| 国产在线高清| 久久人人爽国产| 欧美一级网址| 久久影视中文粉嫩av| 欧美日韩一区二区高清| 国产精品一区二区小说| 久久综合九色综合欧美亚洲| 欧美日韩在线视频免费播放| 欧日韩精品视频| 色视频在线观看| 97香蕉久久超级碰碰高清版| 综合久久成人| 欧美少妇在线观看| 久久国产尿小便嘘嘘| 国产sm调教视频| 欧美视频精品一区| 天天干,夜夜爽| 久久久最新网址| 试看120秒一区二区三区| 中文字幕一区二区三区有限公司| 久久久噜噜噜| 伊人网在线视频观看| 欧美日韩免费网站| 视频二区在线| 日本欧美一二三区| 亚洲婷婷伊人| 日韩有码免费视频| 久久久久国产精品麻豆ai换脸| 精品人妻一区二区三区免费看| 精品亚洲国产成av人片传媒 | 日韩精品二区| 午夜免费看毛片| 国产精品久久久久久久午夜片| 国产男人搡女人免费视频| 国产亚洲欧美日韩一区二区| 新片速递亚洲合集欧美合集| 欧洲精品码一区二区三区免费看| 久久精品主播| 免费看裸体网站| 欧美日韩三级在线| 午夜国产福利在线| 国产在线视频91| 66久久国产| 岛国大片在线免费观看| 亚洲午夜久久久久久久久电影院| 亚洲av永久无码国产精品久久 | 午夜精品成人av| 午夜精品一区二区在线观看| 美女视频黄 久久| 天天综合天天做| 亚洲国产成人在线视频| 暖暖成人免费视频| 手机成人在线| 国产一区二三区好的| 国产亚洲欧美精品久久久www | 成年人视频免费在线观看| 国产日韩精品在线观看| 在线精品国产| www.日本高清| 在线观看日韩毛片| 成人日日夜夜| 国产一区二区不卡视频| 日韩av成人高清| 老湿机69福利| 日韩精品在线视频| 欧美aaaaaa| www.av91| 久久久久国产精品麻豆| 99国产精品99| 欧美一级bbbbb性bbbb喷潮片| 精品国产中文字幕第一页| 久久精品国产露脸对白| 亚洲a一区二区| 中文字幕在线视频区| 国产福利久久| 日韩av网站免费在线| 久久久久黄色片| 亚洲视频在线看| 中文字幕一区日韩精品| 狠狠操精品视频| 亚洲曰韩产成在线| 搞黄视频在线观看| av激情久久| 免费在线观看不卡| 日韩男人的天堂| 色噜噜亚洲精品中文字幕| 精品丝袜久久| 污视频在线观看免费网站| 日韩欧美一区二区三区| 亚洲婷婷噜噜| 亚洲精美视频| 久久亚洲欧美国产精品乐播| 国产激情视频在线播放| 国产美女91呻吟求|