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 实现类,再次启动时就会重新编译。


分享到:


相關文章: