欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

簡(jiǎn)介

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

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

適用場(chǎng)景

多層應(yīng)用程序通常需要在不同的對(duì)象模型(例如實(shí)體和 DTO)之間進(jìn)行映射。編寫(xiě)這樣的映射代碼是一項(xiàng)乏味且容易出錯(cuò)的任務(wù)。MapStruct 旨在通過(guò)盡可能地自動(dòng)化來(lái)簡(jiǎn)化這項(xiàng)工作。

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

說(shuō)白了就解決 beanCopy 的問(wèn)題。

工作時(shí)機(jī)

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

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

使用案例

1、添加依賴(lài)

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

2、定義兩個(gè)類(lèi)

一個(gè) Car 類(lèi)(JPA 實(shí)體類(lèi))

一個(gè) CarDto 類(lèi)(數(shù)據(jù)傳輸類(lèi))

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

Car 類(lèi)

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

CarType 類(lèi)定義

public enum CarType {
    SEDAN;
}

CarDto 類(lèi)

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

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

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

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

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

3). 以一個(gè) Mapper 接口也支持多個(gè)映射方法。所有的這些方法都由 MapStruct 框架來(lái)實(shí)現(xiàn)。我們可以從 Mappers類(lèi)中檢索接口實(shí)現(xiàn)的實(shí)例。通常我們?cè)诮涌谥猩昝饕粋€(gè) INSTANCE 屬性,提供對(duì)外訪(fǎng)問(wèn)的實(shí)例。

3、單元測(cè)試

@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");
}

我們使用起來(lái)就是非常簡(jiǎn)單,運(yùn)行結(jié)果如下:

核心總結(jié)

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

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

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

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

參考文檔

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

相關(guān)文章

最新評(píng)論