MapStruct - 原理讲解
简介
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 - 原理讲解相关推荐
- php 伪静态 page-18.html,PHP 伪静态实现技术原理讲解
PHP 伪静态实现技术原理讲解 发布于 2015-01-18 23:52:58 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Pre ...
- nginx反向代理原理讲解
一 .概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器:并将从服务器上得到的结果 ...
- 微信小游戏开发教程-2D游戏原理讲解
微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...
- 解密汽车全景行车安全系统的前世和今生——第二讲:原理讲解
解密汽车全景行车安全系统的前世和今生--第二讲:原理讲解 来源:深圳市汽车电子行业协会 作者:姜卫忠 发布时间:2013-3-7 浏览(4648)次 解密汽车全景行车安全系统的前世和今生 第二讲:全 ...
- pureMVC简单示例及其原理讲解四(Controller层)
本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...
- IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解
IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解 0.前言 一.光学传感器模块: 1. 光敏传感器模块: 2. 红外避障模块 3. 循迹传感器模块 4. U型光电传感器模块 5. 红外接收模 ...
- 艺点动画-跟随原理讲解
艺点动画-跟随原理讲解 如果要想顺便解决就业问题的话,可以去试试看成都艺点动画,这家教学质量, 蛮高的毕业后是可以直接在公司里面上班的 方法/步骤 1.什么是动画里的跟随? 动画的跟随指的是:物体在运 ...
- 酷狗音乐的爬取,基于python,从无到有完整教程-上:搭建环境及爬取原理讲解
酷狗音乐的爬取,基于python,从无到有完整教程,使用微软新edge作为虚拟浏览器 搭建环境及爬取原理讲解 ⬇⬇⬇ 编码环境及工具准备: 编码工具:PyCharm 所需的库: import requ ...
- AMCL算法原理讲解
ROS进阶教程(二)AMCL算法原理讲解 AMCL算法理解 蒙特卡洛定位算法 蒙特卡洛定位算法自适应变种 里程计运动模型 测距仪模型 波束模型 似然域模型 AMCL算法理解 AMCL(adaptive ...
最新文章
- 语言可以直接访问位元元址_OOP语言中FBC问题对应用框架的影响
- SQL SERVER中直接循环写入数据
- 你应该学会的接口调试神器——Postman高级用法
- python 计时器 timeit repeat 计算(语句)(函数)耗时 时间 运行时长
- ffmpeg-0.8 开源编码解码库从linux下移植到windows vs2005
- iOS:解决pod的Insecure world writable dir问题
- 单机版pc端车牌识别
- MySQL Workbench中PK,NN,UQ,BIN,UN,ZF,AI,G字段类型标识说明
- PatternLayout格式解读
- 幂律分布 计算机科学,Numpy 发现幂律分布
- EA绘制类图时,怎样将类由ICON形式(圆形)转为Label形式(方形)
- DRV8825 TB8825 最佳线路图布局
- Java实现发送手机验证码,发送短信
- [转]QNX系统-基于高通骁龙SA8155平台,中科创达发布智能驾驶舱3.0解决方案
- 再探Java抽象类与接口的设计理念差异
- 华为云学院新春大礼包:场景化微认证上新了! 1
- 计算机组成原理专有名词对应英文全称
- 0x00007FFBD3780C0C (opencv_world341d.dll)处(位于 Project7.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000
- 未来五年,哪个行业最值得创业?
- 酒店计算机网络结构设计原则