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)。

示例:

java 复制代码
@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,如下所示:

java 复制代码
@Data
@AutoMapper(target = TreeNodeDto.class, cycleAvoiding = true)
public class TreeNode {
    private TreeNode parent;
    private List<TreeNode> children;
}

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

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

java 复制代码
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;
}
  • AutoMapping、ReverseAutoMapping 支持 qualifiedByName、conditionQualifiedByName 和 dependsOn 属性
  • AutoMappings 支持配置在方法上面

我是「代码笔耕 」,致力于打造高效简洁、稳定可靠代码的后端开发。

本文可能存在纰漏或错误,如有问题欢迎指正,感谢您阅读这篇文章,如果觉得还行的话,不要忘记点赞、评论、收藏喔!

最后欢迎大家关注我的公众号「代码笔耕」和开源项目:easii (easii) - Gitee.com

相关推荐
AI你一生一世1 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影1 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯2 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
wflynn2 小时前
GitHub 日榜趋势速报 | 2026-11-03
开源·github
冬奇Lab4 小时前
一天一个开源项目(第253篇):dsh-superagent —— DeepSeek 开源的“主动式”编程智能体原型,核心原则是少占人的注意力
人工智能·开源·资讯
字节跳动开源4 小时前
OpenViking 上线原生 3D 内容理解模型
数据库·开源
海的透彻6 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat6 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
車瑜9117 小时前
PM-Skills42个链式工作流-数据分析
开源·产品经理·pm·pm-skills
后台模板学习7 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt