日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils、Spring BeanUtils、Cglib BeanCopier)

發(fā)布時間:2024/8/1 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils、Spring BeanUtils、Cglib BeanCopier) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章轉(zhuǎn)載自:Bean復(fù)制的幾種框架性能比較

Bean復(fù)制的幾種框架性能比較:

測試結(jié)果:

10次測驗第一次第二次第三次平均值每次平均值
BeanUtil.copyProperties54575053.666675.366666667
PropertyUtils.copyProperties44440.4
org.springframework.beans.BeanUtils.copyProperties121011111.1
BeanCopier.create00000

10000次測驗第一次第二次第三次平均值每次平均值
BeanUtil.copyProperties241222226229.66670.022966667
PropertyUtils.copyProperties92909291.333330.009133333
org.springframework.beans.BeanUtils.copyProperties29303230.333330.003033333
BeanCopier.create11110.1

10000次反轉(zhuǎn)測驗第一次第二次第三次平均值每次平均值
BeanUtil.copyProperties178174178176.66670.017666667
PropertyUtils.copyProperties918789890.0089
org.springframework.beans.BeanUtils.copyProperties212121210.0021
BeanCopier.create0110.6666676.66667E-05

注意:Cglib在測試的時候,先進(jìn)行了實例的緩存,這個也是他性能較好的原因之一。如果把緩存去掉的話,性能就會出現(xiàn)了一些的差異,但是整體的性能還是很好,不過奇怪的是10000次反而比10次少,而且后面的反轉(zhuǎn)1萬次反而耗時最少,進(jìn)行多次測試效果也是如此。
從整體的表現(xiàn)來看:

  • Cglib的BeanCopier的性能是最好的無論是數(shù)量較大的1萬次的測試,還是數(shù)量較少10次,幾乎都是趨近與零損耗。
  • Spring是在次數(shù)增多的情況下,性能較好,在數(shù)據(jù)較少的時候,性能比PropertyUtils的性能差一些。
  • PropertyUtils的性能相對穩(wěn)定,表現(xiàn)是呈現(xiàn)線性增長的趨勢。
  • 而Apache的BeanUtil的性能最差,無論是單次Copy還是大數(shù)量的多次Copy性能都不是很好
測驗次數(shù)10次10000次10000次反轉(zhuǎn)
BeanCopier.create412810

cglib BeanCopier 使用小探究:

  • cglib是一款比較底層的操作java字節(jié)碼的框架,其特性包括:
  • 屬性名稱、類型都相同:拷貝OK
  • 屬性名稱相同、類型不同:名稱相同而類型不同的屬性不會被拷貝
    注意:即使源類型是原始類型(int, short和char等),目標(biāo)類型是其包裝類型(Integer, Short和Character等),或反之:都不會被拷貝。
  • 源類和目標(biāo)類有相同的屬性(兩者的getter都存在),但目標(biāo)類的setter不存在 : 創(chuàng)建BeanCopier的時候拋異常。

    網(wǎng)上很多文章說是這里拋得異常:

    我信你個鬼,糟老頭子
    Debug追蹤看一下代碼執(zhí)行過程,根本就沒有執(zhí)行g(shù)enerateClass方法中的代碼呢(如果寫錯了,歡迎大家來吐槽,一起分析),也沒有拋空指針異常,難道版本不一樣嗎!

  • 源類或目標(biāo)類的setter比getter少 : 拷貝OK。此時的setter多余,但不會報錯。

  • 當(dāng)源和目標(biāo)類的屬性類型不同時,不能拷貝該屬性,此時我們可以通過實現(xiàn)Converter接口來自定義轉(zhuǎn)換器:
    直接上代碼吧:

    package com.pica.cloud.patient.resident.server;/*** @ClassName TargetClazz* @Description 目標(biāo)類* @Author Chongwen.jiang* @Date 2019/7/25 17:18* @ModifyDate 2019/7/25 17:18* @Version 1.0*/ public class TargetClazz {private Integer id;private String name;private String createTime;public Integer getId() {return id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCreateTime() {return createTime;}public void setCreateTime(String createTime) {this.createTime = createTime;}public void setId(Integer id) {this.id = id;} }
    package com.pica.cloud.patient.resident.server;import java.sql.Timestamp;/*** @ClassName SourceClazz* @Description 源類* @Author Chongwen.jiang* @Date 2019/7/25 17:17* @ModifyDate 2019/7/25 17:17* @Version 1.0*/ public class SourceClazz {private Integer id;private String name;private Timestamp createTime;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Timestamp getCreateTime() {return createTime;}public void setCreateTime(Timestamp createTime) {this.createTime = createTime;} }
    package com.pica.cloud.patient.resident.server;import org.springframework.cglib.core.Converter;import java.math.BigDecimal; import java.sql.Timestamp; import java.text.SimpleDateFormat;/*** @ClassName AccountConverter* @Description Bean屬性類型轉(zhuǎn)換器* @Author Chongwen.jiang* @Date 2019/7/25 17:56* @ModifyDate 2019/7/25 17:56* @Version 1.0*/ public class TypeConverter implements Converter {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Overridepublic Object convert(Object value, Class target, Object o1) {if (value instanceof Integer) {return (Integer) value;} else if (value instanceof Timestamp) {Timestamp date = (Timestamp) value;return sdf.format(date);} else if (value instanceof BigDecimal) {BigDecimal bd = (BigDecimal) value;return bd.toPlainString();}return null;} }
    package com.pica.cloud.patient.resident.server;import com.alibaba.fastjson.JSON; import com.pica.cloud.patient.resident.server.mapper.WechatUserMapper; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cglib.beans.BeanCopier; import org.springframework.test.context.junit4.SpringRunner;import java.sql.Timestamp;/*** @ClassName DbTest* @Description 測試類* @Author Jun.li0101* @Date 2019/3/21 13:25* @ModifyDate 2019/3/21 13:25* @Version 1.0*/ @SpringBootTest @RunWith(SpringRunner.class) public class DbTest {@Autowiredprivate WechatUserMapper wechatUserMapper;@Testpublic void test1() {SourceClazz sourceClazz = new SourceClazz();sourceClazz.setId(12);sourceClazz.setName("loname");sourceClazz.setCreateTime(Timestamp.valueOf("2019-07-25 15:54:23"));final BeanCopier a = BeanCopier.create(SourceClazz.class, TargetClazz.class, true);TargetClazz targetClazz = new TargetClazz();TypeConverter typeConvert = new TypeConverter();a.copy(sourceClazz, targetClazz, typeConvert);System.out.println(JSON.toJSONString(targetClazz));Assert.assertEquals("2019-07-25 15:54:23", targetClazz.getCreateTime());} }

    注:一旦使用Converter,BeanCopier只使用Converter定義的規(guī)則去拷貝屬性,所以在convert方法中要考慮所有的屬性。

    總結(jié)

    以上是生活随笔為你收集整理的Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils、Spring BeanUtils、Cglib BeanCopier)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。