SpringBoot2.0實戰(10)整合MapStruct優雅地複製屬性


SpringBoot2.0實戰(10)整合MapStruct優雅地複製屬性

在之前章節的例子中,我們在接收參數的時候都是使用的 User 類對象,這是一個 DO 對象,是用於與數據庫進行交互的,而不是用於與前端業務進行交互的,所以需要創建一個 BO 業務對象用來與前端業務進行交互,保證數據隔離性及安全性。

接收參數換成了 BO 對象,但數據入庫使用的是 DO 對象,這中間就需要將 BO 對象的屬性複製到 DO 對象,然後代碼裡就會出現大量的 do.set(bo.get()),這讓代碼顯得臃腫,繁瑣。當然,通過反射或者是使用 Spring 提供的 BeanUtils.copyProperties() 等方法也可以達到簡化代碼的效果,但是在效率方面不盡如人意。

而 MapStruct 則提供了一種高效的解決方案,其實現方式是在編譯期,自動生成相關的 do.set(bo.get()) 代碼,所以,在運行期實際上就是直接調用原生的get/set 方法。

相關知識

MapStruct官網:http://mapstruct.org

課程目標

SpringBoot 整合 MapStruce 以及 Lombok

操作步驟

本文使用 Idea 集成開發環境

環境準備

安裝 MapStruce 插件

File -> settings,打開 Idea 的設置界面,從左側欄選擇 Plugins 選項,再在右側查詢 MapStruce,點擊安裝。

設置IDE

File -> Settings 打開設置界面,

選擇 Build,Execution,Deployment -> Compiler -> Annotation Processors 進入設置界面,

勾選 enable annotation processing

添加依賴

引入 Spring Boot Starter 父工程

SpringBoot2.0實戰(10)整合MapStruct優雅地複製屬性

添加 mapstruct 的依賴

SpringBoot2.0實戰(10)整合MapStruct優雅地複製屬性

同時整合 Lombok,添加對 Lombok 的依賴

SpringBoot2.0實戰(10)整合MapStruct優雅地複製屬性

添加 mapstruct 的插件依賴,同時配置 Lombok

SpringBoot2.0實戰(10)整合MapStruct優雅地複製屬性

編碼

編寫 BO 類,用於接收前端入參

SpringBoot2.0實戰(10)整合MapStruct優雅地複製屬性

編寫 Mappering 轉換器

  • 類上添加 @Mapper 註解,用於項目啟動時自動加載
  • 方法上添加 @Mapping 註解,用於設置轉換規則,source 設置源對象屬性,target 設置目標對象屬性,如果源對象屬性名與目標對象屬性名一致,則無需設置,在本例中,我們需要將 UserBO 對象的 mobile 屬性複製至 User 對象的 name 屬性中
  • 設置常量 INSTANCE,用於其它方法調用,也可以通過 Spring 的 IOC 進行注入


SpringBoot2.0實戰(10)整合MapStruct優雅地複製屬性

編寫 controller 接口

SpringBoot2.0實戰(10)整合MapStruct優雅地複製屬性

驗證結果

編寫測試用例

SpringBoot2.0實戰(10)整合MapStruct優雅地複製屬性

源碼地址

本章源碼 : https://gitee.com/gongm_24/spring-boot-tutorial.git

總結

MapStruct 釋放掉大量的屬性複製的代碼,改為編譯時自動生成,所以只是精簡了項目代碼。

注意

項目編譯後,UserMapper 接口會在 target 目錄的相應路徑下生成一個 class 實現類,通過查看該實現類,可以看到實際生成的代碼結構。但是,在編碼過程中,如果修改了 UserMapper 接口內容,Idea 有時並不會重新編譯,導致最新的修改無法生效,必須得先對項目執行一次 clean 操作,清除掉 class 實現類,再次啟動時就會重新編譯。


分享到:


相關文章: