基于asm實(shí)現(xiàn)比springBeanUtils性能更好的屬性拷貝框架

Bean-Mapping

日常開發(fā)中經(jīng)常需要將一個(gè)對(duì)象的屬性,賦值到另一個(gè)對(duì)象中。

成都創(chuàng)新互聯(lián)專注于農(nóng)安網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供農(nóng)安營(yíng)銷型網(wǎng)站建設(shè),農(nóng)安網(wǎng)站制作、農(nóng)安網(wǎng)頁(yè)設(shè)計(jì)、農(nóng)安網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造農(nóng)安網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供農(nóng)安網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

常見的工具有很多,但都多少不夠簡(jiǎn)潔,要么不夠強(qiáng)大。

我們經(jīng)常使用的 Spring BeanUtils 性能較好,但是特性不足。

Bean-Mapping 提供了很多豐富的特性,便于日常開發(fā)。

如果你追求更加極致的性能,可以考慮使用 asm 實(shí)現(xiàn)的模塊,該實(shí)現(xiàn)性能優(yōu)于 spring BeanUtils 35% 左右。

特性

  • 支持對(duì)象屬性的淺拷貝

  • 支持不同名稱字段的指定賦值

  • 支持自定義字段屬性賦值的條件,比如目標(biāo)字段不為 null 才進(jìn)行賦值

  • 支持自定義字段值轉(zhuǎn)換,可以轉(zhuǎn)換為其他類型,或者相同類型

  • 支持屬性字段為【對(duì)象】【集合】【數(shù)組】的賦值,對(duì)象賦值更加方便。

  • 支持基于 asm 實(shí)現(xiàn)的高性能復(fù)制

快速開始

準(zhǔn)備

JDK1.7 及其以上版本

Maven 3.X 及其以上版本

maven 項(xiàng)目依賴

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>bean-mapping-core</artifactId>
    <version>0.2.5</version>
</dependency>

核心類說明

BeanUtil

提供一個(gè)簡(jiǎn)單的靜態(tài)方法 copyProperties。

/**
 * 復(fù)制屬性
 * 將 source 中的賦值給 target 中名稱相同,且可以賦值的類型中去。類似于 spring 的 BeanUtils。
 * @param source 原始對(duì)象
 * @param target 目標(biāo)對(duì)象
 */
public static void copyProperties(final Object source, Object target)

測(cè)試代碼參考

詳情參見 bean-mapping-test 模塊下的測(cè)試代碼。

示例代碼

對(duì)象的定義

  • BaseSource.java & BaseTarget.java

其中 BaseSource 對(duì)象和 BaseTarget 對(duì)象的屬性是相同的。

public class BaseSource {

    /**
     * 名稱
     */
    private String name;

    /**
     * 年齡
     */
    private int age;

    /**
     * 生日
     */
    private Date birthday;

    /**
     * 字符串列表
     */
    private List<String> stringList;

    //getter & setter
}

屬性賦值測(cè)試案例

我們構(gòu)建 BaseSource 的屬性,然后調(diào)用

BeanUtil.copyProperties(baseSource, baseTarget);

類似于 spring BeanUtils 和 Apache BeanUtils,并驗(yàn)證結(jié)果符合我們的預(yù)期。

    /**
     * 基礎(chǔ)測(cè)試
     */
    @Test
    public void baseTest() {
        BaseSource baseSource = buildBaseSource();
        BaseTarget baseTarget = new BaseTarget();
        BeanUtil.copyProperties(baseSource, baseTarget);

        // 斷言賦值后的屬性和原來相同
        Assertions.assertEquals(baseSource.getAge(), baseTarget.getAge());
        Assertions.assertEquals(baseSource.getName(), baseTarget.getName());
        Assertions.assertEquals(baseSource.getBirthday(), baseTarget.getBirthday());
        Assertions.assertEquals(baseSource.getStringList(), baseTarget.getStringList());
    }

    /**
     * 構(gòu)建用戶信息
     * @return 用戶
     */
    private BaseSource buildBaseSource() {
        BaseSource baseSource = new BaseSource();
        baseSource.setAge(10);
        baseSource.setName("映射測(cè)試");
        baseSource.setBirthday(new Date());
        baseSource.setStringList(Arrays.asList("1", "2"));
        return baseSource;
    }

asm 復(fù)制

簡(jiǎn)介

有時(shí)候我們對(duì)于性能要求較高,而對(duì)便利性要求沒有這么高。

本框架也提供了基于 asm 的復(fù)制方式,性能比 spring 好 35% 左右。

見文末的 benchmark。

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>bean-mapping-asm</artifactId>
    <version>0.2.5</version>
</dependency>

測(cè)試代碼

BeanUtil#copyProperties(Object, Object) 使用類似,但是暫時(shí)不支持注解等更加豐富的功能。

BaseSource baseSource = buildBaseSource();
BaseTarget baseTarget = new BaseTarget();
AsmBeanUtil.copyProperties(baseSource, baseTarget);

拓展閱讀

實(shí)際工作中,我們遇到的情況會(huì)比這個(gè)復(fù)雜一些。

比如兩個(gè)字段名稱不同,我們也想進(jìn)行賦值,值得處理轉(zhuǎn)換等等。

深入學(xué)習(xí)

Bean-Mapping 相關(guān)文檔:

01-項(xiàng)目模塊簡(jiǎn)介和預(yù)期功能

02-BeanMapping 注解的引入

03-不同名稱字段的指定賦值

04-自定義賦值生效的條件

05-自定義字段轉(zhuǎn)換實(shí)現(xiàn)

06-支持屬性字段為【對(duì)象】【集合】【數(shù)組】的賦值

07-BeanUtil#copyProperties(Object, Class) 方法

性能

對(duì)比圖

基于 asm 實(shí)現(xiàn)比 spring BeanUtils 性能更好的屬性拷貝框架

可見框架默認(rèn) bean-mapping 實(shí)現(xiàn)性能一般,涉及到了太多的特性,導(dǎo)致復(fù)制性能略低于 spring。

基于 reflectasm 實(shí)現(xiàn)的 asm-bean-mapping 的性能高于 spring。

代碼示例參見 BeanUtilBeanchmarkTest.java

展望

相對(duì) BeanCopier 這種實(shí)現(xiàn)方式,我們的實(shí)現(xiàn)方式性能還是有很大提升空間。

后期可以考慮實(shí)現(xiàn)類似 BeanCopier 的方式。

開源地址

這個(gè)框架的源代碼全部開源,也便于我們學(xué)習(xí)。

Bean-Mapping

名稱欄目:基于asm實(shí)現(xiàn)比springBeanUtils性能更好的屬性拷貝框架
轉(zhuǎn)載來于:http://muchs.cn/article36/gpjpsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、營(yíng)銷型網(wǎng)站建設(shè)、建站公司、云服務(wù)器、商城網(wǎng)站域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化