简介

MapStruct是用于生成类型安全的bean映射类的Java注解处理器。

你所要做的就是定义一个映射器接口,声明任何需要映射的方法。在编译过程中,MapStruct将生成该接口的实现。此实现使用纯Java的方法调用源对象和目标对象之间进行映射,并非Java反射机制。

与手工编写映射代码相比,MapStruct通过生成冗长且容易出错的代码来节省时间。在配置方法的约定之后,MapStruct使用了合理的默认值,但在配置或实现特殊行为时将不再适用。

与动态映射框架相比,MapStruct具有以下优点:

  • 使用纯Java方法代替Java反射机制快速执行
  • 编译时类型安全:只能映射彼此的对象和属性,不能映射一个Order实体到一个Customer DTO中等等
  • 如果无法映射实体或属性,则在编译时清除错误报告

原理

MapStruct是基于JSR 269的Java注解处理器,因此可以在命令行构建中使用(javac、Ant、Maven等等),也可以在IDE内使用。

它包括以下工件

  • org.mapstruct:mapstruct:包含了必要的注解,例如@Mapping;在Java 8或更高版本中,使用org.mapstruct:mapstruct-jdk8,而不是利用Java 8中引入的语言进行改进。
  • org.mapstruct:mapstruct-processor:包含生成映射器实现的注解处理器

在使用过程中需要只需要配置完成后运行 mvn compile就会发现  target文件夹中生成了一个mapper接口的实现类。打开实现类会发现实体类中自动生成了字段一一对应的get、set方法的文件。

这就是为什么mapstruct的效率比较高的原因,相比于反射获取对象进行拷贝的方法,这种更贴近于原生get、set方法的框架显得更为高效。

这个文件是通过在mapper中的注解,使用生成映射器的注解处理器从而自动生成了这段代码。

看到这里是不是感觉JSR 269注解处理器很熟悉。确实在很多地方都是用到了他,在我之前了解lombok原理时也看到他的身影。那么总让我在这里好好介绍一下他。

注解处理器

1. Java代码编译过程

Java代码编译和执行的整个过程包含了以下三个重要的机制:1)Java源码编译机制;2)类加载机制;3)类执行机制

其中,Java源码编译由以下三个过程组成:1)分析和输入到符号表;2)注解处理;3)语义分析和生成class文件

流程图如下所示:

其中的annotation processing就是代码的注解处理,jdk7之前访问和处理Annotation的工具统称APT(Annotation Processing Tool)(jdk7后就被废除了),jdk7及之后采用了JSR 269 API。

2. 注解处理器的作用

Annotation就像代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取。读取到了程序元素的元数据,就可以执行相应的处理。通过注解,程序开发人员可以在不改变原有逻辑的情况下,在源代码文件中嵌入一些补充信息代码分析工具、开发工具和部署工具可以通过解析这些注解获取到这些补充信息,从而进行验证或者进行部署等

接下来回头来理解lombok通过添加注解来标识实体类,在源码编译的过程中告诉注解处理器这里需要添加get、set方法就很顺理成章了。

MapStruct - 原理讲解相关推荐

  1. php 伪静态 page-18.html,PHP 伪静态实现技术原理讲解

    PHP 伪静态实现技术原理讲解 发布于 2015-01-18 23:52:58 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Pre ...

  2. nginx反向代理原理讲解

    一 .概述                  反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器:并将从服务器上得到的结果 ...

  3. 微信小游戏开发教程-2D游戏原理讲解

    微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...

  4. 解密汽车全景行车安全系统的前世和今生——第二讲:原理讲解

    解密汽车全景行车安全系统的前世和今生--第二讲:原理讲解 来源:深圳市汽车电子行业协会 作者:姜卫忠 发布时间:2013-3-7  浏览(4648)次 解密汽车全景行车安全系统的前世和今生 第二讲:全 ...

  5. pureMVC简单示例及其原理讲解四(Controller层)

    本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...

  6. IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解

    IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解 0.前言 一.光学传感器模块: 1. 光敏传感器模块: 2. 红外避障模块 3. 循迹传感器模块 4. U型光电传感器模块 5. 红外接收模 ...

  7. 艺点动画-跟随原理讲解

    艺点动画-跟随原理讲解 如果要想顺便解决就业问题的话,可以去试试看成都艺点动画,这家教学质量, 蛮高的毕业后是可以直接在公司里面上班的 方法/步骤 1.什么是动画里的跟随? 动画的跟随指的是:物体在运 ...

  8. 酷狗音乐的爬取,基于python,从无到有完整教程-上:搭建环境及爬取原理讲解

    酷狗音乐的爬取,基于python,从无到有完整教程,使用微软新edge作为虚拟浏览器 搭建环境及爬取原理讲解 ⬇⬇⬇ 编码环境及工具准备: 编码工具:PyCharm 所需的库: import requ ...

  9. AMCL算法原理讲解

    ROS进阶教程(二)AMCL算法原理讲解 AMCL算法理解 蒙特卡洛定位算法 蒙特卡洛定位算法自适应变种 里程计运动模型 测距仪模型 波束模型 似然域模型 AMCL算法理解 AMCL(adaptive ...

最新文章

  1. 语言可以直接访问位元元址_OOP语言中FBC问题对应用框架的影响
  2. SQL SERVER中直接循环写入数据
  3. 你应该学会的接口调试神器——Postman高级用法
  4. python 计时器 timeit repeat 计算(语句)(函数)耗时 时间 运行时长
  5. ffmpeg-0.8 开源编码解码库从linux下移植到windows vs2005
  6. iOS:解决pod的Insecure world writable dir问题
  7. 单机版pc端车牌识别
  8. MySQL Workbench中PK,NN,UQ,BIN,UN,ZF,AI,G字段类型标识说明
  9. PatternLayout格式解读
  10. 幂律分布 计算机科学,Numpy 发现幂律分布
  11. EA绘制类图时,怎样将类由ICON形式(圆形)转为Label形式(方形)
  12. DRV8825 TB8825 最佳线路图布局
  13. Java实现发送手机验证码,发送短信
  14. [转]QNX系统-基于高通骁龙SA8155平台,中科创达发布智能驾驶舱3.0解决方案
  15. 再探Java抽象类与接口的设计理念差异
  16. 华为云学院新春大礼包:场景化微认证上新了! 1
  17. 计算机组成原理专有名词对应英文全称
  18. 0x00007FFBD3780C0C (opencv_world341d.dll)处(位于 Project7.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000
  19. 未来五年,哪个行业最值得创业?
  20. 酒店计算机网络结构设计原则

热门文章

  1. GEE开发之Modis_ET数据分析和获取
  2. JMeter脚本录制步骤
  3. Vue3 实用特性总结
  4. vue案例QQ好友列表
  5. 利用计算机控制,计算机控制系统在机器人技术中的应用
  6. 驾照----有效期mark
  7. pscp上传文件至服务器
  8. 南开大学工程训练结课报告
  9. ARDUINO 积木式编辑器整理
  10. 基于word2vec的疾病和手术相关词语的相似度计算