MapStructPlus 1.4.0 版本发布,体积更轻量!性能更强!


MapStruct Plus 是 MapStruct 的增强工具,在 Mapstruct 的基础上,实现了自动生成 Mapper 接口的功能,并强化了部分功能,使 Java 类型转换更加便捷、优雅。

MapStructPlus官网

此次迎来了一次较大版本的更新,更新日志如下:

  • 优化复杂对象转换逻辑,占用元空间更小!性能更快!

此版本针对于复杂对象的自动转换逻辑,进行了优化和部分的重新设计,减少了一些不必要的转换方法,占用元空间更小。

以 RuoYi-Vue-Plus 为例,使用新版本后,元空间占用减少了 7MB,根据项目的复杂程度不同,减少的内存占用也有所不同。

且根据 issue#67 中提到,在 SpringBoot + Aop 场景下,性能会受影响, 在新版本中,修改了实现方式,性能比提升一半以上。

  • 去除 hutool 等依赖,目前项目中只依赖了 MapStruct

从 1.4.0 版本之后,去除了 MapStruct 之外的依赖,打包后体积更小。

但当需要使用 Map 与对象转换时,需要额外引入 hutool-core 依赖包。

  • 适配对象循环嵌套场景

类循环嵌套是指两个类互相引用,例如,源对象和目标对象结构都包含父对象和子对象之间的双向关联。 当存在这种情况时,直接进行转换时,会导致栈溢出的问题(stack overflow error)。

示例:

@Data
public class TreeNode {
    private TreeNode parent;
    private List<TreeNode> children;
}

@Data
public class TreeNodeDto {
    private TreeNodeDto parent;
    private List<TreeNodeDto> children;
}

parent 属性可以是其他类型的,可能跨越一个更长的属性链形成的嵌套循环。

为了适配这种情况,MapStructPlus 的 AutoMapper 注解中增加了 cycleAvoiding 属性,该属性用于标识,是否需要避免循环嵌套的问题。 默认为 false,如果需要避免循环嵌套,需要将该属性设置为 true

当配置为 true 时,在整个对象的转换过程链路中,会传递一个 CycleAvoidingMappingContext 对象,临时保存转换生成的对象, 在转换链路中,如果发现需要生成的对象已经存在,会直接返回该类型,从而避免栈溢出问题。

以上面的示例为例,在 AutoMapper 注解中,配置 cycleAvoiding 属性为 true,如下所示:

@Data
@AutoMapper(target = TreeNodeDto.classcycleAvoiding true)
public class TreeNode {
    private TreeNode parent;
    private List<TreeNode> children;
}

@Data
@AutoMapper(target = TreeNode.classcycleAvoiding true)
public class TreeNodeDto {
    private TreeNodeDto parent;
    private List<TreeNodeDto> children;
}

编译生成的转换逻辑如下:

public TreeNodeDto convert(TreeNode arg0, CycleAvoidingMappingContext arg1) {
    TreeNodeDto target = arg1.getMappedInstance(arg0, TreeNodeDto.class);
    if (target != null) {
        return target;
    }

    if (arg0 == null) {
        return null;
    }

    TreeNodeDto treeNodeDto = new TreeNodeDto();

    arg1.storeMappedInstance(arg0, treeNodeDto);

    treeNodeDto.setParent(demoConvertMapperAdapterForCycleAvoiding.iglm_TreeNodeToTreeNodeDto(arg0.getParent(), arg1));
    treeNodeDto.setChildren(
        demoConvertMapperAdapterForCycleAvoiding.iglm_TreeNodeToTreeNodeDto(arg0.getChildren(), arg1));

    return treeNodeDto;
}
  • AutoMappingReverseAutoMapping 支持 qualifiedByNameconditionQualifiedByNamedependsOn 属性

  • AutoMappings 支持配置在方法上面


相關推薦

2023-04-26

MapStructPlus 1.2.3 版本现已发布,具体更新内容如下: MapStruct 版本由 1.5.3.Final 升级为 1.5.5.Final 增加自定义 ConvertMapperAdapter 和 MapConvertMapperAdapter 类名和包名的功能,可以参考配置文档 生成的转换接口,自动接入自定义转换

2024-01-08

并强化了部分功能,使 Java 类型转换更加便捷、优雅。 MapStructPlus官网 更新日志 兼容内部类转换 示例: @Data @AutoMapper(target = Car.InnerClass.class) public class InnerClassTarget {     private String&nbs

2023-06-18

支持 问题描述 一段时间以来,有好几位朋友反馈过 MapStructPlus 在使用时,修改了类,启动会报错,但重新执行 mvn clean compile 又恢复了正常。 就是这么一个莫名其妙的问题,最近终于想到了原因! 原因 首先,该问题出现

2023-03-28

当需要进行枚举转换时(例如枚举转换为编码值,或者又编码转换为枚举),可以在目标枚举添加 @AutoEnumMapper 注解, 增加该注解后,在任意类型中需要转换该枚举时都可以自动转换。 使用该注解需要注意:当前注解必

2022-12-13

公告写道,这是 Vant 自 2017 年开源以来发布的第四个重要版本。 在本次迭代中,Vant 支持了深色模式,增加五个新组件,改善工具函数 API 并重构 Picker 等组件,同时继续在轻量化和易用性方面做出改进。 Vant 是一个轻量、可

2023-01-16

一款基于PHP+MYSQL的轻量型内容管理/博客系统,支持PHP5.6版本以上,支持win/Linux系统。 它自主研发的RP框架(OPP方式),采用MVC架构搭建的高效、稳定的内容管理系统。灵活小巧,但有着强大的扩展性、丰富的插件接口和大量的

2022-09-17

英特尔酷睿 i9 12900K 和 AMD 锐龙9 5950X 是两家厂商目前性能最强的桌面端 CPU 型号,虽然英特尔 Raptor Lake 和 AMD Zen 4 的规格信息都陆续浮出水面,但毕竟还没有正式上市,那么不妨先在这个新老交替的时间点来看看目前市售最强桌

2023-09-07

esign 和 Google 品牌配色中汲取灵感,相比旧版图标 3D 效果更强同时可根据使用场景搭配更加灵活的光影和色彩效果。 Android 品牌的文本徽标也采用了更为圆滑的字体曲线,首字母从小写 a 替换为大写 A,此外 Google 还为本次品

2023-09-15

NET 8 发布了首个 RC。据称 RC 阶段会发布两个版本,正式版将于 2023 年 11 月 14 日至 16 日在 .NET Conf 2023 上推出。.NET 8 是长期支持 (LTS) 版本,将会获得 3 年技术支持。 公告写道,此版本为 Android 和 WASM 引入了全新的 AOT 模式

2023-07-11

对比于业内的其他产品的学习成本较高,需引多个包,包体积较大的痛点,  Koala Form 提供了更强的 UI 库支持度、 维护性和复用性, 并且提供了极强的场景封装能力,使用和学习成本更低,降低开发的复杂度。  特性概

2023-11-07

023年11月6日,DataEase开源数据可视化分析平台正式发布v2.0版本。DataEase开源项目创立于2021年1月,于2021年6月发布v1.0版本。相比v1.x版本,DataEase v2.0版本采用了更加轻量级的架构设计,功能模块在保留原有“仪表板”模块的基础上

2022-11-16

小、更好的代码。近日 Emerge 发布了一份报告,显示最新版本的 Xcode 存在会无意中增加应用程序体积的问题。 Xcode 14 于今年 9 月份正式发布,新版本添加了对 Swift 5.7 的支持,并针对 macOS Ventura、iOS/iPadOS 16 等最新系统添加了 SDK

2022-05-24

12 升级到 22.04。 Python 升级到 3.10 Python 已经升级到 3.10 版本,所有模块都针对 python 3.10 进行了重建。 手动安装的 Python 模块必须针对 3.10 重新编译。 弃用/删除 PHP 7 包已移至测试,因为它很快将 EOL ,取而代之的是 PHP 8

2022-09-14

(XP 到 Win 11)上运行。 目前 PhotoDemon 9.0 已发布,此版本的亮点包括:改进的用户界面、新的选择工具(包括对多项选择的支持)、对许多新图像格式(AVIF、Paintshop Pro (PSP)、GIMP (XCF)、SVG 等)的支持)、内容感知填充、新的