首页 > 其他分享 >MapStruct使用指南以及原理解析

MapStruct使用指南以及原理解析

时间:2023-12-11 11:55:19浏览次数:36  
标签:文件 解析 Java 映射 MapStruct 处理器 注解 使用指南

使用指南:https://juejin.cn/post/6956190395319451679
原理解析:https://blog.csdn.net/begefefsef/article/details/126434950
image
1.MapStruct原理
是一个Java注解处理器,它基于编译时代码生成的原理,用于自动化Java bean类型之间的映射工作。以下是MapStruct的工作原理的详细解读:

注解处理: 在Java编译阶段,MapStruct通过Java的注解处理器API(JSR 269)扫描源代码中的接口或抽象类,这些接口或抽象类使用了MapStruct提供的注解,如@Mapper或@Mapping。

抽象方法解析: MapStruct分析这些接口或抽象类中定义的抽象方法,这些方法通常表示从一个bean类型转换到另一个bean类型的映射。MapStruct解析方法参数和返回值,确定源类型和目标类型。

属性映射分析: MapStruct使用内置的策略或者通过@Mapping注解指定的策略来分析两个bean之间属性的对应关系。如果属性名称相同且类型兼容,MapStruct会自动映射这些属性。

代码生成: 一旦分析完毕,MapStruct会为每个映射接口生成一个实现类。这个实现类包含了具体的映射逻辑,能够将一个对象的属性复制到另一个对象的相应属性中。

编译时优化: 因为所有的映射代码都是在编译时生成的,所以运行时没有反射的开销,这意味着MapStruct生成的代码在性能上与手写的映射代码类似。

类型转换: 如果源属性和目标属性的类型不匹配,MapStruct会尝试使用内置的类型转换器或者开发者可以自定义转换逻辑来进行转换。

嵌套属性和集合: MapStruct也支持嵌套属性的映射和集合类型的映射,允许复杂的数据结构之间的转换。

更新现有对象: 除了创建目标类型的新实例之外,MapStruct还允许将属性映射到现有的实例上。

构建工具集成: MapStruct可以很容易地与Maven或Gradle等构建工具集成,自动在编译过程中执行代码生成。

IDE集成: 由于MapStruct是在编译时生成代码,所以大多数Java IDE都能够很好地支持MapStruct,包括在生成的实现类中进行代码跳转和调试。

综上所述,MapStruct的主要优点是它通过在编译时生成映射代码,从而提供快速、类型安全并且易于维护的映射代码,而不需要开发者手动编写大量的映射逻辑。

2.Java的注解处理器API(JSR 269)说明如下
Java的注解处理器API(JSR 269),正式名称为Pluggable Annotation Processing API,是Java SE 6中引入的一项功能,允许开发者创建自定义注解处理器,这些处理器在编译时可以检查和处理注解。这是MapStruct工作原理的核心部分。以下是注解处理器如何在MapStruct中工作的详细说明:

编译器集成: 注解处理器在Java编译器(javac)的编译过程中运行。当javac编译Java源代码时,它会检查源代码中使用的注解。

发现注解处理器: 开发者可以通过在服务配置文件中声明或者使用编译器参数来指定注解处理器。MapStruct的注解处理器被声明在META-INF/services/javax.annotation.processing.Processor文件中,所以javac能够自动加载并调用它。

处理注解: 一旦javac发现了MapStruct的注解处理器,它会将所有使用了MapStruct注解(如@Mapper)的源代码元素(类、接口、方法等)传递给处理器。MapStruct的处理器会分析这些元素。

抽象语法树(AST): 注解处理器可以访问抽象语法树(AST),这是源代码的一个结构化表示。通过AST,处理器可以读取类、方法、字段和它们的注解等信息。

生成代码: 注解处理器可以生成新的源代码文件。MapStruct的处理器使用这个能力来生成实现了映射接口的具体类。这些生成的类包含了必要的映射逻辑,将一个对象的属性转换到另一个对象。

类型检查: 注解处理器还可以进行类型检查,确认注解的使用是否符合预期的规则。如果不符合,它可以生成编译错误或警告。

环回机制: 如果注解处理器生成新的代码,这些代码可能包含新的注解,javac会在后续的编译轮次中处理这些新生成的代码。这个过程会一直进行,直到没有新的注解处理器输出为止。

多轮处理: 注解处理器可能会在多轮编译过程中运行。在每一轮中,处理器会接收到当前轮次未处理的注解类型。处理器必须管理它在每一轮中的状态,因为它可能需要在多轮中累积信息。

总结来说,MapStruct通过注解处理器在编译时分析使用了MapStruct注解的源代码,并生成相应的映射类。这一切都在Java编译器的控制之下进行,确保了生成的代码是即时和准确的,而且不会对运行时性能产生影响。
3.META-INF文件夹用来做什么的
META-INF目录是Java JAR文件的一部分,它用于存储JAR文件的元数据,也就是关于JAR包本身的数据和配置信息。这个目录通常包含以下几种类型的文件和子目录:

MANIFEST.MF: 这是JAR文件中最重要的文件之一,位于META-INF目录下。它包含了JAR文件的元数据,例如主类(Main-Class)的名称、JAR文件的版本、创建者信息、包的签名信息等。Java运行时使用这些信息来执行和验证JAR文件。

签名文件和签名块文件: 如果JAR文件被签名,那么签名文件(.SF或.DSA或.RSA文件)和签名块文件(.RSA或.DSA或.EC文件)会被放在META-INF目录下。这些文件用来验证JAR文件的完整性和来源。

服务提供者配置文件: 用于服务加载机制的配置文件(如javax.annotation.processing.Processor),它们通常放在META-INF/services目录下,这些文件用来指定服务接口的实现类,以供服务加载器使用。

其他资源文件: 除了上述文件外,META-INF目录还可以包含其他资源文件,如属性文件、配置文件、图片等,这些文件通常由JAR包内的应用程序使用。

索引文件: 有时候,META-INF目录还可能包含用于加速类加载的索引文件(如INDEX.LIST)。

在Java EE或者其他Java技术栈中(如OSGi),META-INF目录用途更广泛,可能包含如persistence.xml、beans.xml、ejb-jar.xml等更多特定于技术的配置文件。

因此,META-INF目录是JAR文件的一个重要组成部分,用于存储JAR包的元数据和配置信息,并且是Java平台中约定俗成用于此目的的目录。

标签:文件,解析,Java,映射,MapStruct,处理器,注解,使用指南
From: https://www.cnblogs.com/Anti-General/p/17894068.html

相关文章

  • Sermant:无代理服务网格架构解析及无门槛玩转插件开发
    本文分享自华为云社区《Sermant:无代理服务网格架构解析及无门槛玩转插件开发》,作者:华为云社区精选。本期直播的主题是《从架构设计到开发实践,深入浅出了解Sermant》,华为云云原生DTSE技术布道师、华为云高级工程师、Sermant开源社区PMC核心成员栾文飞,为广大开发者详细从架构设计......
  • 抽象工厂模式:角色解析与应用探索
    前言工厂模式一般指的是简单工厂模式、工厂方法模式、抽象工厂模式,这是三种工厂模式的最后一篇,其他两种的文章链接如下:设计模式之是简单工厂模式_凡夫编程的技术博客_51CTO博客工厂方法模式:改变你对软件开发的认知_凡夫编程的技术博客_51CTO博客建议三种模式放在一起对比学习,更能......
  • mysql中count函数的几种写法解析
    一、count(主键)innodb引擎会遍历整张表,把每一行的主键值都取出来返回给服务层,服务层拿到主键后直接按行进行计数累加二、count(特定字段)2.1没有notnull约束innodb引擎会遍历整张表,把每一行的字段值都取出来返回给服务层,服务层判断是否为null,不为null计数累加2.2有no......
  • 深入解析Jenkins流水线:构建、部署和自动化交付
    enkins是一个强大的开源自动化服务器,而Jenkins流水线(JenkinsPipeline)是一种以代码为基础的自动化方式,允许您定义和管理CI/CD过程。在本文中,我们将深入探讨Jenkins流水线的各个方面,包括其基本概念、语法、构建、部署以及实现自动化交付的最佳实践。第1部分:基本概念和语法1.1什么是......
  • 云手机概念 云手机服务器的底层开发解析
    云手机服务器的底层开发解析作为一个语言模型,我可以提供一般性的了解和常见的云手机服务器技术细节,但无法提供特定云手机服务器的详细底层开发解析。以下是一些常见的云手机服务器技术和相关细节:虚拟化技术:云手机服务器通常使用虚拟化技术,如容器化或虚拟机(VM)来创建和管理虚拟......
  • 深度解读DBSCAN聚类算法:技术与实战全解析
    探索DBSCAN算法的内涵与应用,本文详述其理论基础、关键参数、实战案例及最佳实践,揭示如何有效利用DBSCAN处理复杂数据集,突破传统聚类限制。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里......
  • 宝塔面板申请ssl证书验证失败,域名解析错误或验证URL无法被访
    一、问题描述使用宝塔面板建立站点,申请let‘sEncrypt免费ssl证书时提示验证失败,域名解析错误或验证URL无法被访!网上找了各种方案检查防火墙配置,安全组配置,域名解析,nginx代理等等乱七八糟的配置检查来检查去发现都没问题,后来我注意到,这个错误提示是去访问本站点内的一个文......
  • 学C笔记归纳 第九篇——分支循环语句3_for_while_do while(附九九乘法表解析和三种方式
     基础语法模版:while(1 条件控制语句){2 语句序列;}顺序:121212....21 do{ 1语句序列; }while(2 循环控制表达式);顺序:121212....12  for(1 初始化表达式;2 条件控制语句;4 调整表达式){3......
  • Spring Boot学习随笔- 集成JSP模板(配置视图解析器)、整合Mybatis(@MapperScan注解的使用
    学习视频:【编程不良人】2021年SpringBoot最新最全教程第五章、JSP模板集成5.1引入JSP依赖<!--引入jsp解析依赖--><!--C标签库--><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></depen......
  • 解析几何笔记:平面的仿射变换
    目录平面的仿射变换定义放缩变换重要性质点与向量的仿射变换仿射标架的仿射变换变积系数平面的定向平行四边形的仿射变换前后定向面积的特性变积系数及其特性参考平面的仿射变换定义定义平面的一个点变换τ,如果它在一个仿射坐标系中的公式为\[\begin{pmatrix}x'\\y'\end{p......