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

MapStruct到底是什么?

 更新時(shí)間:2021年06月16日 11:29:45   作者:-Jared  
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文中圍繞MapStruct到底是什么展開,文中有非常詳細(xì)的解釋及代碼示例,需要的朋友可以參考下

一、簡(jiǎn)介

現(xiàn)在的分布式系統(tǒng)中模塊劃分越來(lái)越細(xì),不同模塊的實(shí)體、DTO、DO等需要進(jìn)行轉(zhuǎn)換,這么多工程處理起來(lái)不是那么簡(jiǎn)單。

MapStruct 就是這樣的一個(gè)屬性映射插件,用于為Java Bean生成類型安全且高性能的映射。它基于編譯階段生成get/set代碼,此實(shí)現(xiàn)過(guò)程中沒(méi)有反射,不會(huì)造成額外的性能損失。只需要定義一個(gè) Mapper 接口,MapStruct 就會(huì)自動(dòng)實(shí)現(xiàn)這個(gè)映射接口,避免了繁瑣的映射實(shí)現(xiàn)。

🍭 官網(wǎng) - 🍤 官方示例

優(yōu)點(diǎn)

與手工編寫映射代碼相比

  • MapStruct通過(guò)生成冗長(zhǎng)且容易出錯(cuò)的代碼來(lái)節(jié)省時(shí)間。

與動(dòng)態(tài)映射框架相比

  • 簡(jiǎn)單泛型智能轉(zhuǎn)換;
  • 效率高:無(wú)需手動(dòng) set/get 或 implements Serializable 以達(dá)到深拷貝;
  • 性能更高:使用簡(jiǎn)單的 Java 方法調(diào)用代替反射;
  • 編譯時(shí)類型安全:只能映射相同名稱或帶映射標(biāo)記的屬性;
  • 編譯時(shí)產(chǎn)生錯(cuò)誤報(bào)告:如果映射不完整(存在未被映射的目標(biāo)屬性)或映射不正確(找不到合適的映射方法或類型轉(zhuǎn)換)則會(huì)在編譯時(shí)拋出異常。

二、Demo

2.1 導(dǎo)入依賴

使用該插件主要需要導(dǎo)入兩個(gè)包:

::: details Maven | Gradle

Maven

<dependency>
        <groupId>org.mapstruct</groupId>
        <!-- jdk8以下就使用mapstruct -->
        <artifactId>mapstruct-jdk8</artifactId>
        <version>1.3.0.Final</version>
    </dependency>
				<!-- 注解處理器 -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.3.0.Final</version>
    </dependency>

Gradle

plugins {
    ...
    id "com.diffplug.eclipse.apt" version "3.26.0" // Only for Eclipse
}

dependencies {
    ...
    compile 'org.mapstruct:mapstruct:1.4.2.Final'

    annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
    testAnnotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final' // if you are using mapstruct in test code
}
...

2.2 示例代碼

::: details domain、vo、mapper、controller

domain/Person.java

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Person {

    private Long id;

    private String name;

    private Integer age;

    private Integer sex;

}

vo/PersonVO.java

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PersonVO {
    private Long personId;
    private String personName;
    private Integer age;
}

mapper/PersonMapper.java

@Mapper(componentModel = "spring")
public interface PersonMapper {
    /**
     * ClassLoader 的方式獲取當(dāng)前 mapper (可以不用)
     */
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
    /**
     * 實(shí)體轉(zhuǎn)VO
     * source
     * @param person
     * @return PersonVO
     */
    @Mappings({
            @Mapping(source = "id", target = "personId"),
            @Mapping(source = "name", target = "personName")
    })
    PersonVO toPersonVO(Person person);

    /**
     * VO轉(zhuǎn)實(shí)體
     *
     * @param person
     * @return PersonVO
     */
    @Mappings({
            @Mapping(source = "personId", target = "id"),
            @Mapping(source = "personName", target = "name"),
      			@Mapping(target = "sex", ignore = true),
    })
    Person toPerson(PersonVO person);

}

Controller

@RestController
@RequestMapping("/api")
public class TestMapStructController {

    @Autowired
    PersonMapper personMapper;

    @GetMapping("convert")
    public List<Object> convertEntity() {
        ArrayList<Object> objectList = new ArrayList<>();
        Person person = Person.builder()
                .id(5L)
                .name("zhangsan")
                .age(12)
                .sex(1)
                .build();
        objectList.add(person);

        PersonVO personVO = personMapper.toPersonVO(person);
        Person person1 = personMapper.toPerson(personVO);
        objectList.add("person 轉(zhuǎn) personVO" + personVO);
        objectList.add("personVO 轉(zhuǎn) person" + person1);
        return objectList;
    }
}

打包后會(huì)看見(jiàn) mapstruct 為我們生成了 mapper 的實(shí)現(xiàn)類

image-20210609160633395 

三、 注解介紹

@Mapper :MapStruct 注解處理器會(huì)掃描這個(gè)注解

先介紹一下 @Mapper 注解的 componentModel 屬性,該屬性用于自動(dòng)生成的接口實(shí)現(xiàn)類的組件類型,這個(gè)屬性支持四個(gè)值:

1.default : 這是默認(rèn)的情況,mapstruct 不使用任何組件類型, 可以通過(guò)Mappers.getMapper(Class)方式獲取自動(dòng)生成的實(shí)例對(duì)象。

2.cdi : 生成的映射器是一個(gè)應(yīng)用程序范圍的 CDI bean,可以通過(guò) @Inject 檢索

3.spring : 生成的實(shí)現(xiàn)類上面會(huì)自動(dòng)添加一個(gè)@Component注解,可以通過(guò)Spring的 @Autowired方式進(jìn)行注入

4.jsr330 : 生成的實(shí)現(xiàn)類上會(huì)添加@javax.inject.Named 和@Singleton注解,可以通過(guò) @Inject注解獲取

@Mappings:配置多個(gè)@Mapping

@Mapping 屬性映射,若源對(duì)象屬性與目標(biāo)對(duì)象名字一致,會(huì)自動(dòng)映射對(duì)應(yīng)屬性

1.source :參數(shù)類的屬性

2.target :要轉(zhuǎn)換的類的屬性

3.ignore :配合 target 使用,表示改轉(zhuǎn)換類的的屬性不需要映射

4.expression :配合 target 使用,表示改轉(zhuǎn)換類的的屬性使用指定的表達(dá)式進(jìn)行轉(zhuǎn)換

@Mapping(
         target = "someProp",
         expression = "java(new TimeAndFormat( s.getTime(), s.getFormat() ))"
)

5.expression :配合 target 使用,表示改轉(zhuǎn)換類的的屬性使用指定的表達(dá)式進(jìn)行轉(zhuǎn)換

@Mapping(
         target = "someProp",
         expression = "java(new TimeAndFormat( s.getTime(), s.getFormat() ))"
)

其他請(qǐng)參考源文件或官網(wǎng),后續(xù)用到再補(bǔ)充

到此這篇關(guān)于MapStruct到底是什么?的文章就介紹到這了,更多相關(guān)MapStruct的使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于aop切面 注解、參數(shù)如何獲取

    關(guān)于aop切面 注解、參數(shù)如何獲取

    這篇文章主要介紹了關(guān)于aop切面 注解、參數(shù)如何獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • 學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫

    學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫

    這篇文章主要介紹了學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫,這個(gè)日歷小程序僅用簡(jiǎn)單的算法實(shí)現(xiàn)沒(méi)有用到date類等,但是帶有圖形界面,需要的朋友可以參考下
    2016-02-02
  • 詳解Spring中的攔截器與過(guò)濾器

    詳解Spring中的攔截器與過(guò)濾器

    Filter?過(guò)濾器和Interceptor?攔截器是SpringBoot?的?Web?項(xiàng)目開發(fā)中長(zhǎng)用到的,本文主要來(lái)和大家討論一下?Filter?與?Interceptor?的做法及它們之間的區(qū)別,需要的可以參考下
    2023-07-07
  • file.mkdir()、file.mkdirs()和file.createNewFile()的區(qū)別

    file.mkdir()、file.mkdirs()和file.createNewFile()的區(qū)別

    本文主要介紹了file.mkdir()、file.mkdirs()和file.createNewFile()的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java的ConcurrentHashMap中不能存儲(chǔ)null的原因解析

    Java的ConcurrentHashMap中不能存儲(chǔ)null的原因解析

    眾所周知,在Java中Map可以存儲(chǔ)null,而ConcurrentHashMap不能存儲(chǔ)null值,那么為什么呢?今天通過(guò)源碼分析給大家詳細(xì)解讀,感興趣的朋友一起看看吧
    2022-07-07
  • Java項(xiàng)目安全處理方法

    Java項(xiàng)目安全處理方法

    這篇文章主要介紹了Java項(xiàng)目安全處理方法,URL中參數(shù)顯示,sql拼接問(wèn)題,需要的朋友可以參考下
    2017-09-09
  • springboot整合gateway實(shí)現(xiàn)網(wǎng)關(guān)功能的示例代碼

    springboot整合gateway實(shí)現(xiàn)網(wǎng)關(guān)功能的示例代碼

    本文主要介紹了springboot整合gateway實(shí)現(xiàn)網(wǎng)關(guān)功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java源碼解析Integer方法解讀

    Java源碼解析Integer方法解讀

    這篇文章主要介紹了Java源碼解析Integer方法解讀,包括toString方法、toUnsignedString方法、highestOneBit方法等,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java8中Optional類型和Kotlin中可空類型的使用對(duì)比

    Java8中Optional類型和Kotlin中可空類型的使用對(duì)比

    這篇文章主要給大家介紹了關(guān)于Java8中Optional類型和Kotlin中可空類型的使用對(duì)比,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 基于java構(gòu)造方法Vector遍歷元素源碼分析

    基于java構(gòu)造方法Vector遍歷元素源碼分析

    本篇文章是關(guān)于ava構(gòu)造方法Vector源碼分析系列文章,本文主要介紹了Vector遍歷元素的源碼分析,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09

最新評(píng)論

连南| 陈巴尔虎旗| 修文县| 孟津县| 会昌县| 祁阳县| 威宁| 峨眉山市| 辽宁省| 淮安市| 玉屏| 宜兴市| 罗田县| 舟山市| 桂平市| 汤原县| 凌云县| 蕲春县| 安福县| 大城县| 济阳县| 广东省| 兴国县| 沁源县| 遵义县| 桐城市| 芜湖县| 隆子县| 高安市| 达尔| 托克逊县| 阿坝| 潍坊市| 枝江市| 渑池县| 南城县| 平凉市| 九台市| 营山县| 峨边| 商河县|