最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MapStruct對象映射轉(zhuǎn)換解決Bean屬性拷貝性能問題

 更新時間:2022年02月11日 15:44:21   作者:心城以北  
無意間看到項目中有小伙伴用到了 MapStruct 來做對象映射轉(zhuǎn)換當(dāng)時我就很好奇,這個是什么框架,能夠解決什么問題,帶著這兩個疑問就有了下面的文章

簡介

MapStruct 是一個代碼生成器(可以生成對象映射轉(zhuǎn)換的代碼),它基于約定優(yōu)于配置的方法,極大地簡化了 Java bean 類型之間的映射實現(xiàn)。

生成的映射代碼使用普通的方法調(diào)用,因此速度快、類型安全且易于理解。

適用場景

多層應(yīng)用程序通常需要在不同的對象模型(例如實體和 DTO)之間進行映射。編寫這樣的映射代碼是一項乏味且容易出錯的任務(wù)。MapStruct 旨在通過盡可能地自動化來簡化這項工作。

與其他映射框架相比,MapStruct 在編譯時生成 bean 映射,這確保了高性能,允許快速的開發(fā)人員反饋和徹底的錯誤檢查。

說白了就解決 beanCopy 的問題。

工作時機

MapStruct 是一個注解處理器,它插入到 Java 編譯器中,可用于命令行構(gòu)建(Maven、Gradle 等)以及您首選的 IDE。

MapStruct 使用合理的默認(rèn)值,但在配置或?qū)崿F(xiàn)特殊行為時會采取措施。

使用案例

1、添加依賴

// mapstruct
implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
復(fù)制代碼

2、定義兩個類

一個 Car 類(JPA 實體類)

一個 CarDto 類(數(shù)據(jù)傳輸類)

這兩個類型非常相似,只是在計數(shù)屬性的字段名不同,并且 type 屬性是 CarType 枚舉類型,CarDto 中是字符串類型。

Car 類

public class Car {
    private String make;
    private int numberOfSeats;
    private CarType type;
    //constructor, getters, setters etc.
}

CarType 類定義

public enum CarType {
    SEDAN;
}

CarDto 類

public class CarDto {
    private String make;
    private int seatCount;
    private String type; 
    //constructor, getters, setters etc.
}

創(chuàng)建轉(zhuǎn)換器類接口,定義需要將 Car 對象轉(zhuǎn)換為 CarDto 對象

@Mapper
public interface CarMapper {
    CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
    @Mapping(source = "numberOfSeats", target = "seatCount")
    CarDto carToCarDto(Car car);
}

1). @Mapper 注解將該接口標(biāo)記為映射接口,并且讓 MapStruct 處理器在編譯期間進行處理,實際映射方法為 carToCarDto 目的就是原參數(shù)Car,轉(zhuǎn)換為方法返回結(jié)果對象 CarDto

2). 對于源對象和目標(biāo)對象中有不同的屬性名稱,我們可以使用 @Mapping 注解進行映射。在默認(rèn)情況下,將源對象和目標(biāo)對象據(jù)歐不同的類型屬性執(zhí)行類型轉(zhuǎn)換,例如,type 數(shù)據(jù)原來是枚舉,可以自動轉(zhuǎn)換為字符串。

3). 以一個 Mapper 接口也支持多個映射方法。所有的這些方法都由 MapStruct 框架來實現(xiàn)。我們可以從 Mappers類中檢索接口實現(xiàn)的實例。通常我們在接口中申明一個 INSTANCE 屬性,提供對外訪問的實例。

3、單元測試

@Test
public void shouldMapCarToDto () {
    //given
    Car car = new Car("Morris", 5, CarType.SEDAN);
    //when
    CarDto carDto = CarMapper.INSTANCE.carToCarDto(car);
    //then
    assertThat(carDto).isNotNull();
    assertThat(carDto.getMake()).isEqualTo("Morris");
    assertThat(carDto.getSeatCount()).isEqualTo(5);
    assertThat(carDto.getType()).isEqualTo("SEDAN");
}

我們使用起來就是非常簡單,運行結(jié)果如下:

核心總結(jié)

MapStruct其實和 Lombok 有些類似,也是通過插件的方式在我們編譯期為我們生成一些輔助的代碼。但是MapStruct 專注是解決 BeanCopy 以及對象轉(zhuǎn)換的場景。

下面我們看看,就是我們 CarMapper 的實現(xiàn)類 CarMapperImpl , 這些都是框架在編譯期間,我們生成的代碼。

如果我們使用 BeanUtils.copyProperties來做對象的轉(zhuǎn)換是需要通過反射來獲取對象的屬性,方法等信息。然后再去賦值。反射雖然能夠解決一些通用性的場景,但是對于頻繁的 List 復(fù)制,性能是不高的。我們可以看看下面copyProperties的部分代碼截圖:

個人覺得 MapStruct的優(yōu)勢還是非常明顯的,就是幫助我們少寫了非常多的 getters, setters 進行對象的相互轉(zhuǎn)換,性能高于任何一種屬性復(fù)制。缺點就會降低程序編譯速度,增加轉(zhuǎn)換層提升代碼復(fù)雜度。

參考文檔

以上就是MapStruct對象映射轉(zhuǎn)換解決Bean屬性拷貝性能問題的詳細(xì)內(nèi)容,更多關(guān)于MapStruct解決Bean屬性拷貝的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解用maven將dubbo工程打成jar包運行

    詳解用maven將dubbo工程打成jar包運行

    這篇文章主要介紹了詳解用maven將dubbo工程打成jar包運行,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解SpringBoot Mongo 自增長ID有序規(guī)則

    詳解SpringBoot Mongo 自增長ID有序規(guī)則

    本文主要介紹springboot基于mongodb有序id生成,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Mybatis如何開啟控制臺打印sql語句

    Mybatis如何開啟控制臺打印sql語句

    在SpringBoot與Mybatis整合開發(fā)中,開啟控制臺SQL語句打印是一個常見需求,有助于調(diào)試與性能優(yōu)化,方法一:在Mybatis配置文件mybatis-config.xml中添加設(shè)置;方法二:在SpringBoot配置文件application.yml或properties中
    2024-11-11
  • 用html css javascript打造自己的RIA圖文教程

    用html css javascript打造自己的RIA圖文教程

    用html&css&javascript打造自己的RIA之一,包括了配置等
    2009-07-07
  • Java中的Scanner、BufferedReader?和?StreamTokenizer使用詳解

    Java中的Scanner、BufferedReader?和?StreamTokenizer使用詳解

    Scanner是Java?中一個用于解析原始類型(如?int、double?等)和字符串的類,它通常從輸入流中逐個讀取數(shù)據(jù)并進行解析,支持多種分隔符的使用,本文介紹Java中的Scanner、BufferedReader?和?StreamTokenizer的相關(guān)知識,感興趣的朋友一起看看吧
    2025-02-02
  • Java判斷字節(jié)流是否是 UTF8編碼方法示例

    Java判斷字節(jié)流是否是 UTF8編碼方法示例

    這篇文章主要我大家介紹了Java判斷字節(jié)流是否是 UTF8編碼方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • nacos一直頻繁的打印日志get changegroupkeys問題

    nacos一直頻繁的打印日志get changegroupkeys問題

    這篇文章主要介紹了nacos一直頻繁的打印日志get changegroupkeys問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java中ScheduledExecutorService介紹和使用案例(推薦)

    Java中ScheduledExecutorService介紹和使用案例(推薦)

    ScheduledExecutorService是Java并發(fā)包中的接口,用于安排任務(wù)在給定延遲后運行或定期執(zhí)行,它繼承自ExecutorService,具有線程池特性,可復(fù)用線程,提高效率,本文主要介紹java中的ScheduledExecutorService介紹和使用案例,感興趣的朋友一起看看吧
    2024-10-10
  • Spring Utils工具類常用方法實例

    Spring Utils工具類常用方法實例

    這篇文章主要介紹了Spring Utils工具類常用方法實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot實現(xiàn)過濾器Filter的三種方式

    SpringBoot實現(xiàn)過濾器Filter的三種方式

    過濾器Filter由Servlet提供,基于函數(shù)回調(diào)實現(xiàn)鏈?zhǔn)綄W(wǎng)絡(luò)請求與響應(yīng)的攔截與修改,本文講給大家詳細(xì)介紹SpringBoot實現(xiàn)過濾器Filter的三種方式,需要的朋友可以參考下
    2023-08-08

最新評論

开封县| 蒙山县| 嘉峪关市| 永定县| 连平县| 平谷区| 峨眉山市| 乌兰县| 乐业县| 紫云| 岱山县| 阿荣旗| 明光市| 沧源| 牡丹江市| 大荔县| 三都| 红桥区| 荣成市| 宝坻区| 延边| 芜湖市| 洪湖市| 区。| 酒泉市| 和龙市| 营口市| 永定县| 星子县| 阿克陶县| 永泰县| 荥阳市| 阜阳市| 南宫市| 富源县| 夏邑县| 遵义市| 桓台县| 长垣县| 页游| 临朐县|