国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

為什么阿里巴巴禁止使用Apache Beanutils進(jìn)行屬性的copy?

開發(fā) 后端
在日常開發(fā)中,我們經(jīng)常需要給對(duì)象進(jìn)行賦值,通常會(huì)調(diào)用其set/get方法,有些時(shí)候,如果我們要轉(zhuǎn)換的兩個(gè)對(duì)象之間屬性大致相同,會(huì)考慮使用屬性拷貝工具進(jìn)行

[[341294]]

 在日常開發(fā)中,我們經(jīng)常需要給對(duì)象進(jìn)行賦值,通常會(huì)調(diào)用其set/get方法,有些時(shí)候,如果我們要轉(zhuǎn)換的兩個(gè)對(duì)象之間屬性大致相同,會(huì)考慮使用屬性拷貝工具進(jìn)行。

如我們經(jīng)常在代碼中會(huì)對(duì)一個(gè)數(shù)據(jù)結(jié)構(gòu)封裝成DO、SDO、DTO、VO等,而這些Bean中的大部分屬性都是一樣的,所以使用屬性拷貝類工具可以幫助我們節(jié)省大量的set和get操作。

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

1、Spring BeanUtils 

2、Cglib BeanCopier 

3、Apache BeanUtils 

4、Apache PropertyUtils 

5、Dozer

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

由于篇幅優(yōu)先,關(guān)于這幾種工具類的用法及區(qū)別,還有到底是什么是淺拷貝和深拷貝不在本文的討論范圍內(nèi)。

本文主要聚焦于對(duì)比這幾個(gè)類庫的性能問題。

性能對(duì)比

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

代碼示例如下:

首先定義一個(gè)PersonDO類: 

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

再定義一個(gè)PersonDTO類: 

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

然后進(jìn)行測(cè)試類的編寫:

使用Spring BeanUtils進(jìn)行屬性拷貝: 

  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用于記錄代碼執(zhí)行時(shí)間,方便進(jìn)行對(duì)比。

使用Cglib BeanCopier進(jìn)行屬性拷貝: 

  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進(jìn)行屬性拷貝: 

  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進(jìn)行屬性拷貝: 

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

然后執(zhí)行以下代碼: 

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

得到結(jié)果如下:

工具類 執(zhí)行1000次耗時(shí) 執(zhí)行10000次耗時(shí) 執(zhí)行100000次耗時(shí) 執(zhí)行1000000次耗時(shí)
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

畫了一張折線圖更方便大家進(jìn)行對(duì)比

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

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

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

其實(shí),是因?yàn)锳pache BeanUtils力求做得完美, 在代碼中增加了非常多的校驗(yàn)、兼容、日志打印等代碼,過度的包裝導(dǎo)致性能下降嚴(yán)重。

總結(jié)

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

但是本文只是站在性能這一單一角度進(jìn)行了對(duì)比,我們?cè)谶x擇一個(gè)工具類的時(shí)候還會(huì)有其他方面的考慮,比如使用成本、理解難度、兼容性、可擴(kuò)展性等,對(duì)于這種拷貝類工具類,我們還會(huì)考慮其功能是否完善等。

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

本文用到的第三方類庫的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. <!--日志相關(guān)-->  
  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>  

 

責(zé)任編輯:龐桂玉 來源: Java編程
相關(guān)推薦

2020-07-30 12:16:33

阿里巴巴Apache對(duì)象

2023-01-11 08:06:42

對(duì)象賦值項(xiàng)目開發(fā)

2018-10-16 15:34:17

阿里巴巴Apache Flin大數(shù)據(jù)

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外循環(huán)內(nèi)循環(huán)

2021-08-04 17:20:30

阿里巴巴AsyncJava

2013-08-22 09:26:38

去IOE王堅(jiān)

2019-06-26 07:54:53

ArrayListsubList源碼

2019-09-04 11:02:54

繼承層次組合

2019-09-02 15:20:28

Java開發(fā)繼承

2016-09-21 20:28:55

阿里巴巴IOE

2020-09-14 09:47:56

Java開發(fā)類型

2022-08-30 16:38:30

阿里巴巴JavaLog4j

2019-01-29 10:30:32

阿里巴巴Java字符串

2019-02-27 09:00:13

阿里巴巴for循環(huán)Java

2021-09-07 17:22:43

阿里巴巴辭職高薪
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

精品在线一区| av国产在线观看| 精品av一区二区| 日韩欧美aaaaaa| 特黄特色大片免费视频大全| 国产高清精品网站| 国产精品亚洲一区| 福利欧美精品在线| 精品国产在天天线2019| 啊灬啊灬啊灬啊灬高潮在线看| 国产一区美女在线| 丁香五月网久久综合| 久久97精品| 色妞色视频一区二区三区四区| 九九在线视频| 亚洲丝袜制服诱惑| 日本黄网站免费| 久久国产精品第一页| 国产精品swag| 欧美韩日高清| 日韩女优人人人人射在线视频| 亚洲精品大片| 日韩av在线免费观看一区| av国产在线观看| 欧美性少妇18aaaa视频| 国产精品三级a三级三级午夜| 久久久久高清精品| 日韩小视频在线播放| 精品一区二区三区久久| 欧美高清性xxxxhd| 久久午夜影院| 91地址最新发布| 欧美日韩导航| 久久免费视频网站| 给我免费播放日韩视频| 欧美肥婆姓交大片| a级日韩大片| 97精品国产97久久久久久| 欧美三级一区| 欧美韩国理论所午夜片917电影| 日韩成人综合网站| 久久精品一偷一偷国产| 久久青草视频| 伦理中文字幕亚洲| 日韩欧洲国产| 久久久综合免费视频| 亚洲一区网址| 欧美有码在线视频| 欧美视频免费| 亚洲精品免费网站| 在线成人www免费观看视频| 国产精品久久久久久久久久久久午夜片 | 久久久一区二区| 国产白丝袜美女久久久久| 国产成人精品综合在线观看| 成人午夜免费在线| 国产亚洲1区2区3区| 天美星空大象mv在线观看视频| 欧美国产日本视频| 中文字幕一二三区在线观看| 在线观看www91| a'aaa级片在线观看| 精品国产一区二区三区在线观看 | 国产视频一区二区在线观看| 精品免费国产一区二区| 亚洲美女精品一区| av在线中文| 亚洲精品久久久久久久久| 99久久婷婷国产综合精品首页| 欧美精品在线免费| 99久久精品费精品国产| 牛人盗摄一区二区三区视频| 国产电影精品久久禁18| 国产真实生活伦对白| 欧美三级资源在线| 中文另类视频| 国产精品揄拍一区二区| 日本不卡一区二区| 黄色片视频在线| 一本大道av伊人久久综合| 免费在线看污片| 久久久久久久999| 在线观看不卡| 鲁一鲁一鲁一鲁一澡| 狠狠爱在线视频一区| 无遮挡爽大片在线观看视频| 2020欧美日韩在线视频| 国产一区二区高清| 无码人妻h动漫| 在线视频中文字幕一区二区| 天天综合网站| 成人午夜激情网| 成人精品视频.| 神马亚洲视频| 久久久精品国产网站| 国产精品va| 免费在线观看的毛片| 欧美视频中文字幕| 亚洲视频精选| 日本a级片久久久| 亚洲精品日产精品乱码不卡| 性欧美ⅴideo另类hd| 欧美亚洲一级片| 韩国欧美国产1区| 三级国产在线观看| 欧美国产在线视频| 黄色精品一二区| 成人免费黄色网页| 午夜精品久久久久久久99热浪潮| 麻豆久久婷婷| 中文字幕不卡| 久久久久亚洲精品成人网小说| 老司机精品导航| 亚洲精品666| 久久精品电影网| 免费不卡在线观看| 色就是色亚洲色图| 性欧美在线看片a免费观看| 国产一区二三区| 欧美精品电影| 成人免费大片黄在线播放| 久久久99精品久久| 国产精品粉嫩| 色涩成人影视在线播放| 精品久久香蕉国产线看观看gif| 96视频在线观看欧美| 一区不卡字幕| 欧美一区三区四区| 欧美日韩综合| 蜜桃视频网站www| 欧美日本高清视频| 成人精品视频一区二区三区尤物| 免费在线中文字幕| 欧美在线视频二区| 在线不卡免费av| 精品动漫一区| 日韩一二三四| 91精品啪在线观看麻豆免费| 亚洲免费在线看| 农村少妇一区二区三区四区五区| 日韩av一二三四区| 永久免费毛片在线播放不卡| 久久国产生活片100| dy888亚洲精品一区二区三区| 999热视频| 在线日韩一区二区| 欧美日韩岛国| caoporn国产精品免费视频| 91视频-88av| 欧美自拍偷拍一区| 伊人久久大香线蕉综合热线| porn亚洲| 四虎永久在线精品免费一区二区| 欧美精品vⅰdeose4hd| 性色一区二区三区| 久久av色综合| 国产女教师bbwbbwbbw| 中文字幕国产精品| 久久天堂av综合合色蜜桃网| 亚洲一区二区三区在线免费| 中文字幕 91| 热久久视久久精品18亚洲精品| 亚洲欧洲中文日韩久久av乱码| 亚洲涩涩av| 深夜福利在线视频| 九九九九精品| 日韩av在线资源| 99精品国产91久久久久久| 一本色道69色精品综合久久| 奇米影视四色在线| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 中文字幕国内自拍| 91高潮精品免费porn| 亚洲小说欧美激情另类| 欧美精品三区| 青青在线视频| 国产一区二区片| 久久久亚洲国产| 亚洲国产一二三| 欧美日韩精品一本二本三本| 日本在线视频网址| 日本a视频在线观看| 51视频国产精品一区二区| 欧美日韩在线视频一区| 国产亚洲成人一区| av成人在线播放| va中文字幕| 老牛影视免费一区二区| 国产亚洲福利一区| 一区二区三区中文免费| 亚洲制服少妇| crdy在线观看欧美| 粉嫩粉嫩芽的虎白女18在线视频| 久久精品国产第一区二区三区最新章节 | 日本99精品| 欧美最顶级a∨艳星| 欧美一区二区三区在线播放| 久久久国产视频| 一本久久精品一区二区 | 7777奇米亚洲综合久久|