Spring Boot MapStruct 快速拷貝方案選擇

MapStruct是一個用於生成類型安全,高性能和無依賴的bean映射代碼的註釋處理器。競爭對手是Selmahtml

項目地址:gitee.com/SoftMeng/sp…

介紹

MapStruct是一個Java 註釋處理器,用於生成類型安全的bean映射類。java

您所要作的就是定義一個mapper接口,該接口聲明任何所需的映射方法。在編譯期間,MapStruct將生成此接口的實現。此實現使用普通的Java方法調用來在源對象和目標對象之間進行映射,即沒有反射或相似。git

與手工編寫映射代碼相比,MapStruct經過生成繁瑣且易於編寫的代碼來節省時間。遵循約定優於配置方法,MapStruct使用合理的默認值,但在配置或實現特殊行爲時會採起措施。spring

與動態映射框架相比,MapStruct具備如下優點:apache

  • 經過使用普通方法調用而不是反射來快速執行安全

  • 編譯時類型安全:只能映射相互映射的對象和屬性,不會將訂單實體意外映射到客戶DTO等。app

  • 在構建時清除錯誤報告,若是框架

    • 映射不完整(並不是全部目標屬性都已映射)eclipse

    • 映射不正確(找不到合適的映射方法或類型轉換)maven

組件介紹

mapstruct

包含所需的註釋,例如@Mapping

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.3.0.Final</version>
</dependency>
複製代碼

mapstruct-processor

在編譯,生成映射器實現的註釋處理器,配置在pom.xml中build編譯插件中。

<path>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.3.0.Final</version>
</path>
複製代碼

IntelliJ IDEAEclipse IDE

  • IntelliJ IDEA 能夠配置對應的插件Mapstruct Support
  • Eclipse IDE 能夠配置M2E插件
  • Eclipse IDE 須要在pom.xml中指定<m2e.apt.activation>jdt_apt</m2e.apt.activation>

mapstruct-processor 註解處理器中的選項

通常配置在pom.xml中build編譯插件中

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <annotationProcessorPaths>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>1.3.0.Final</version>
            </path>
        </annotationProcessorPaths>
        <compilerArgs>
            <compilerArg>
                -Amapstruct.suppressGeneratorTimestamp=true
            </compilerArg>
            <compilerArg>
                -Amapstruct.suppressGeneratorVersionInfoComment=true
            </compilerArg>
        </compilerArgs>
    </configuration>
</plugin>
複製代碼
選項 說明 默認值
mapstruct. suppressGeneratorTimestamp 若是設置爲true,@Generated則抑制在生成的映射器類中的註釋中建立時間戳。 false
mapstruct. suppressGeneratorVersionInfoComment 若是設置爲true,則抑制在生成的映射器類comment中的@Generated註釋中建立屬性。註釋包含有關MapStruct版本以及用於註釋處理的編譯器的信息。 false
mapstruct.defaultComponentModel 組件模型的名稱(請參閱檢索映射器)基於應生成的映射器。 default
mapstruct.unmappedTargetPolicy 若是未使用源值填充映射方法的目標對象的屬性,則應用默認報告策略。 WARN

檢索映射器

支持的值 說明 檢索實例
default 映射器不使用組件模型,一般經過檢索實例 Mappers#getMapper(Class)
cdi 生成的映射器是一個應用程序範圍的CDI bean @Inject
spring 生成的映射器是一個單例範圍的Spring bean @Autowired
jsr330 生成的映射器使用{@code @Named}進行註釋 @Inject

使用

基本映射

要建立映射器,只需使用所需的映射方法定義Java接口,並使用註釋對其進行org.mapstruct.Mapper註釋

@Mapper
public interface CardMapper {
    CardMapper INSTANCE = Mappers.getMapper(CardMapper.class);

    /** * card 轉 CardDto . * * @param card * @return */
    @Mapping(target = "maker", source = "make")
    CardDto dto(Card card);

    /** * CardDt 轉 card . * * @param cardDto * @return */
    @Mapping(target = "make", source = "maker")
    Card entity(CardDto cardDto);
}
複製代碼

該@Mapper註釋將使得MapStruct代碼生成器建立的執行CardMapper過程當中生成時的界面。

在生成的方法實現中,源類型(例如Card)中的全部可讀屬性將被複制到目標類型中的相應屬性中(例如CardDto

  • 當某個屬性與其目標實體對應的名稱相同時,它將被隱式映射。
  • 當屬性在目標實體中具備不一樣的名稱時,能夠經過@Mapping註釋指定其名稱。

轉換特徵

MapStruct的通常原理是生成儘量多的代碼,就像你本身親自編寫代碼同樣。特別地,這意味着經過普通的setter / setter調用而不是反射或相似的方法將值從源複製到目標。

MapStruct會考慮源和目標類型的全部公共屬性。這包括在超類型上聲明的屬性。

MapStruct會進行某些隱式轉換

public class CardMapperImpl implements CardMapper {

    @Override
    public CardDto dto(Card card) {
        if ( card == null ) {
            return null;
        }

        CardDto cardDto = new CardDto();

        cardDto.setMaker( card.getMake() );
        cardDto.setName( card.getName() );
        cardDto.setNote( card.getNote() );
        cardDto.setImage( card.getImage() );
        cardDto.setCreateTime( card.getCreateTime() );
        cardDto.setPrice( card.getPrice() );

        return cardDto;
    }

    @Override
    public Card entity(CardDto cardDto) {
        if ( cardDto == null ) {
            return null;
        }

        Card card = new Card();

        card.setMake( cardDto.getMaker() );
        card.setName( cardDto.getName() );
        card.setNote( cardDto.getNote() );
        card.setImage( cardDto.getImage() );
        card.setCreateTime( cardDto.getCreateTime() );
        card.setPrice( (int) cardDto.getPrice() );

        return card;
    }
}
複製代碼

生成實現類位置以下:

位置
屏幕截圖.png
相關文章
相關標籤/搜索