国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

MapStruct教程-三種方式處理繼承關系

開發(fā) 前端
MapStruct是一個效率工具,可以在處理Java Bean映射時,幫助我們盡量減少樣板代碼,只需要定義接口,它會自動生成映射邏輯。本文中,我們一起看下如何通過MapStruct處理集成關系。

你好,我是看山。

MapStruct是一個效率工具,可以在處理Java Bean映射時,幫助我們盡量減少樣板代碼,只需要定義接口,它會自動生成映射邏輯。本文中,我們一起看下如何通過MapStruct處理集成關系。

我們將討論三種方法:

  1. 通過實例檢查;
  2. 使用訪問者模式;
  3. 【推薦】使用@SubclassMapping注解。

一、背景

默認情況下,MapStruct無法為所有從基類或接口繼承的類生成映射器,不支持運行時識別實例和對象層次結(jié)構(gòu)。

(一)基礎定義

先定義POJO類:

public abstract class Vehicle {
    private String color;
    private String speed;
}

public class Car extends Vehicle{
    private Integer tires;
}

public class Bus extends Vehicle {
    private Integer capacity;
}

再定義對應的DTO類:

public class VehicleDTO {
    private String color;
    private String speed;
}

public class CarDTO extends VehicleDTO{
    private Integer tires;
}

public class BusDTO extends VehicleDTO{
    private Integer capacity;
}

(二)定義映射器

這里我們定義三個映射器:CarMapper、BusMapper、VehicleMapper:

@Mapper
public interface CarMapper {
    CarDTO carToDTO(Car car);
}

@Mapper
public interface BusMapper {
    BusDTO busToDTO(Bus bus);
}

@Mapper(uses = {BusMapper.class, CarMapper.class})
public interface VehicleMapper {
    VehicleDTO vehicleToDTO(Vehicle vehicle);
}

在這里,我們分別定義了所有子類的映射器,并在基類映射器通過uses配置使用它們。

(三)識別問題

我們先看下VehicleMapper的生成類:

public class VehicleMapperImpl implements VehicleMapper {

    @Override
    public VehicleDTO vehicleToDTO(Vehicle vehicle) {
        if ( vehicle == null ) {
            return null;
        }

        VehicleDTO vehicleDTO = new VehicleDTO();

        vehicleDTO.setColor( vehicle.getColor() );
        vehicleDTO.setSpeed( vehicle.getSpeed() );

        return vehicleDTO;
    }
}

可以看到,代碼中是直接使用了VehicleDTO,并沒有用到子類的任何定義。我們可以在入口傳入Car或Bus的實例對象,但是最終得到的只能是VehicleDTO的實例。

二、通過實例檢查實現(xiàn)

我們一起看看如何通過實例檢查實現(xiàn)映射邏輯,因為比較簡單,直接代碼:

@Mapper
public interface VehicleMapperByInstanceChecks {
    CarDTO map(Car car);

    BusDTO map(Bus bus);

    default VehicleDTO mapToVehicleDTO(Vehicle vehicle) {
        if (vehicle instanceof Bus) {
            return map((Bus) vehicle);
        } else if (vehicle instanceof Car) {
            return map((Car) vehicle);
        } else {
            return null;
        }
    }
}

從上面代碼來說,其實完全是靠人工智能實現(xiàn)的,通過我們HardCode,借助instanceof實現(xiàn)類型判斷,轉(zhuǎn)換為需要的類型實例。

三、通過訪問者模式實現(xiàn)

第二種方式是借助訪問者模式實現(xiàn),通過Java的多態(tài),可以精準的調(diào)用到需要的方法。

(一)應用訪問者模式

首先在抽象類Vehicle中定義抽象方法accept(),以接受任何訪問者對象:

public abstract class Vehicle {
    public abstract VehicleDTO accept(Visitor visitor);
}

public interface Visitor {
    VehicleDTO visit(Car car);

    VehicleDTO visit(Bus bus);
}

現(xiàn)在,我們需要為每個Vehicle子類實現(xiàn)accept()方法:

public class Bus extends Vehicle {
    @Override
    VehicleDTO accept(Visitor visitor) {
        return visitor.visit(this);
    }
}

public class Car extends Vehicle {
    @Override
    VehicleDTO accept(Visitor visitor) {
        return visitor.visit(this);
    }
}

最后,我們可以通過實現(xiàn)訪問者接口來實現(xiàn)映射器:

@Mapper
public abstract class VehicleMapperByVisitorPattern implements Visitor {
    public VehicleDTO mapToVehicleDTO(Vehicle vehicle) {
        return vehicle.accept(this);
    }

    @Override
    public VehicleDTO visit(Car car) {
        return map(car);
    }

    @Override
    public VehicleDTO visit(Bus bus) {
        return map(bus);
    }

    abstract CarDTO map(Car car);

    abstract BusDTO map(Bus bus);
}

從性能來說,訪問者模式方法比實例檢查方法更優(yōu)化,借助Java的多態(tài)實現(xiàn),快速定位轉(zhuǎn)換方法。從代碼量來說,實例檢查會由于訪問者模式,因為寫的少。

其實這里會引出一個問題,設計模式是好是壞?

四、使用@SubclassMapping實現(xiàn)

MapStruct提供了@SubclassMapping注解,允許我們配置的映射器,可以處理有繼承關系的類實例轉(zhuǎn)換。

@SubclassMapping注解中有source和target兩個配置,source定義要映射的源子類,target定義要映射到的目標子類:

(一)定義

我們使用@SubclassMapping注解指定繼承對應關系:

@Mapper(uses = {BusMapper.class, CarMapper.class})
public interface VehicleMapperBySubclassMapping {
    @SubclassMapping(source = Car.class, target = CarDTO.class)
    @SubclassMapping(source = Bus.class, target = BusDTO.class)
    VehicleDTO mapToVehicleDTO(Vehicle vehicle);
}

生成的映射代碼為:

public class VehicleMapperBySubclassMappingImpl implements VehicleMapperBySubclassMapping {

    private final BusMapper busMapper = Mappers.getMapper( BusMapper.class );
    private final CarMapper carMapper = Mappers.getMapper( CarMapper.class );

    @Override
    public VehicleDTO mapToVehicleDTO(Vehicle vehicle) {
        if ( vehicle == null ) {
            return null;
        }

        if (vehicle instanceof Car) {
            return carMapper.carToDTO( (Car) vehicle );
        }
        else if (vehicle instanceof Bus) {
            return busMapper.busToDTO( (Bus) vehicle );
        }
        else {
            VehicleDTO vehicleDTO = new VehicleDTO();

            vehicleDTO.setColor( vehicle.getColor() );
            vehicleDTO.setSpeed( vehicle.getSpeed() );

            return vehicleDTO;
        }
    }
}

可以看到,MapStruct自動實現(xiàn)了實例檢查,通過instanceof判斷類型。

責任編輯:武曉燕 來源: 看山的小屋
相關推薦

2009-09-25 14:12:16

Hibernate繼承

2020-11-01 17:10:46

異步事件開發(fā)前端

2025-01-24 00:00:00

MapStruct子類型Mapper

2012-07-17 09:16:16

SpringSSH

2024-07-08 09:03:31

2021-11-05 21:33:28

Redis數(shù)據(jù)高并發(fā)

2019-11-20 18:52:24

物聯(lián)網(wǎng)智能照明智能恒溫器

2009-07-03 18:32:18

JSP頁面跳轉(zhuǎn)

2014-07-30 17:10:38

LVS集群負載均衡

2021-06-24 08:52:19

單點登錄代碼前端

2014-12-31 17:42:47

LBSAndroid地圖

2010-03-12 17:52:35

Python輸入方式

2011-04-08 11:13:50

CISCO IOS令牌桶雙桶

2010-06-13 16:04:14

MySQL三種安裝方式

2025-01-13 00:00:00

MapStruct枚舉映射

2025-01-16 00:00:00

MapStruct映射

2017-07-14 15:07:23

2009-07-29 09:36:07

無線通信接入方式

2015-01-16 17:41:45

數(shù)據(jù)中心模塊化

2021-11-26 11:07:14

cowsay命令Linux
點贊
收藏

51CTO技術(shù)棧公眾號

国产成人综合在线观看| 久久精品99久久香蕉国产色戒| 性色av一区二区三区红粉影视| 六月婷婷久久| 日韩mv欧美mv国产网站| 69av一区二区三区| 国产精品三级a三级三级午夜| 黄色精品一二区| 91中文字幕一区| jizz18欧美18| 亚洲日本成人女熟在线观看| av在线播放av| 亚洲午夜日本在线观看| 国产午夜福利100集发布| 宅男噜噜噜66国产日韩在线观看| 久久免费视频在线观看| av资源中文在线| 日本久久一区二区三区| 一本岛在线视频| 成人午夜视频在线| 涩涩涩999| 999亚洲国产精| 亚洲综合大片69999| 香蕉久久精品| 欧美国产亚洲视频| 伦一区二区三区中文字幕v亚洲| 欧美一区二区三区白人| 日中文字幕在线| 一区二区不卡在线播放 | 丰满少妇又爽又紧又丰满69| 成人精品免费网站| 中文字幕色呦呦| 美女视频一区二区| 日本一区二区免费看| 国产欧美一区二区三区国产幕精品| 国产精品视频永久免费播放| 狠狠一区二区三区| 欧美成人精品一区二区三区| 国内精品伊人| 日韩一区av在线| 久久精品国产福利| 高h视频在线观看| 99精品视频在线播放观看| 91免费看视频| 中文字幕黄色大片| 久久青草久久| 日韩欧美一区二区三区久久婷婷| 亚洲欧美春色| 风流少妇一区二区| 亚洲国产一区自拍| 人狥杂交一区欧美二区| 精品国产a毛片| 色是在线视频| 日韩中文字幕第一页| 一区二区三区自拍视频| 57pao精品| 亚洲精品一区二区在线看| 成人女人免费毛片| 蜜臀av在线播放一区二区三区| 男人的天堂视频在线| 91在线观看免费视频| 在线观看成人影院| 91黄色免费看| 中文字幕资源网在线观看免费 | 精品国产91久久久久久| 高清毛片在线看| 精品国产乱码久久久久久牛牛 | 爱爱永久免费视频| 午夜电影一区二区三区| 免费在线视频欧美| 亚洲欧洲激情在线| 伊人久久影院| 91精品久久久久久久久久入口 | 日韩av在线精品| 日韩一级特黄| 热99久久精品| 亚洲激情网站| 亚洲美免无码中文字幕在线| 中文字幕综合网| 91看片在线观看| 亚洲人成伊人成综合网久久久| 美国十次av导航亚洲入口| 国产精品亚洲综合| 成人激情校园春色| 最近最好的中文字幕2019免费| 欧美高清一级片在线| 在线播放成人| 国产高清在线精品一区二区三区| 韩国理伦片一区二区三区在线播放 | 免费成年网站| 337p亚洲精品色噜噜噜| 国产亚洲精彩久久| 国产在线视频2019最新视频| 久久99精品久久久久久久久久久久 | 久久99国内精品| 99re精彩视频| 678五月天丁香亚洲综合网| 欧美少妇激情| 亚洲综合最新在线| av在线播放一区二区三区| 欧美日本韩国一区二区| 国产亚洲综合久久| 91精品99| 国产免费黄视频| 欧美日韩mp4| 性欧美lx╳lx╳| 免费观看国产视频在线| 欧美日韩亚洲成人| 中文字幕久久精品一区二区| 奇米视频888战线精品播放| 亚洲精品综合在线| 欧美一区 二区 三区| 亚洲自拍另类欧美丝袜| 久久久久久久久久久黄色| 久久黄色美女电影| 国产成人精品综合久久久| 成人在线视频首页| 2024最新电影免费在线观看| 国产精品九九九| 久久精品综合网| 中文字幕人成乱码在线观看 | 久久久青草婷婷精品综合日韩| 在线观看成人网| 日韩中文字幕视频在线| 天堂va蜜桃一区二区三区漫画版| 黑巨人与欧美精品一区| 最近2019中文字幕mv免费看| 视频一区在线播放| 九色视频网站在线观看| 日本久久久久久久久久久| 91原创在线视频| 国模私拍视频在线播放| 成人片在线免费看| 性做久久久久久久免费看| av日韩精品| 黑鬼大战白妞高潮喷白浆| 日韩精品小视频| 日韩电影免费在线| 欧美日韩在线看片| 国产精品日韩一区二区免费视频| 午夜精品一区在线观看| 大色综合视频网站在线播放| 免费黄视频网站| 人人做人人澡人人爽欧美| 国产亚洲综合在线| 日韩视频1区| 成人免费视频久久| 美女黄色丝袜一区| 99国内精品久久| 国产精久久一区二区| a级黄色一级片| 免费不卡在线观看av| 久久九九久久九九| 欧美电影院免费观看| 国产一级不卡毛片| 性欧美办公室18xxxxhd| 中文字幕五月欧美| 国产一区二区三区四区| 伊人精彩视频| 91视频免费网站| 在线观看视频欧美| 国产欧美日韩一区二区三区在线| 成人在线观看一区| 精品国产一区二区三区日日嗨| 欧美日韩中文字幕一区二区| 亚洲毛片播放| 欧美一卡二卡| 四虎4hu永久免费入口| 中文字幕在线成人| 国产亚洲1区2区3区| 五月天亚洲一区| 亚洲成人天堂| 精品伦理一区二区三区| 日韩av中文字幕在线播放| 成人在线视频一区| 国产丝袜一区| 日韩美女一级视频| 欧美一级二级三级| 这里只有视频精品| 综合欧美一区二区三区| 88国产精品视频一区二区三区| 黄色网址在线免费| 欧美成人精品免费| 欧美有码在线视频| 欧美性猛交xxxx黑人交| 久久精品久久精品| 成功精品影院| 国产中文在线视频| 中文字幕中文字幕在线中一区高清| 一个色综合导航| 一区二区三区四区乱视频| 在线观看视频日韩| 97欧美成人| 在线观看中文字幕| 在线视频91| 欧美中文字幕在线播放| 欧美视频一区二区在线观看| 岛国精品一区二区| 99久久.com| 素人一区二区三区|