日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

在日常開發(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呢?

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

 

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

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

性能對(duì)比

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

代碼示例如下:

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

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

 

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

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

 

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

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

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

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

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

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

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

}

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

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

}

得到結(jié)果如下:

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

 

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

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

 

綜上,我們基本可以得出結(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依賴如下:

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

分享到:
標(biāo)簽:阿里巴巴
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定