MapStruct Plus 是 MapStruct 的增强工具,在 Mapstruct 的基础上,实现了自动生成 Mapper 接口的功能,并强化了部分功能,使 Java 类型转换更加便捷、优雅。
此次迎来了一次较大版本的更新,更新日志如下:
- 优化复杂对象转换逻辑,占用元空间更小!性能更快!
此版本针对于复杂对象的自动转换逻辑,进行了优化和部分的重新设计,减少了一些不必要的转换方法,占用元空间更小。
以 RuoYi-Vue-Plus 为例,使用新版本后,元空间占用减少了 7MB,根据项目的复杂程度不同,减少的内存占用也有所不同。
且根据 issue#67 中提到,在 SpringBoot + Aop 场景下,性能会受影响, 在新版本中,修改了实现方式,性能比提升一半以上。
- 去除 hutool 等依赖,目前项目中只依赖了 MapStruct
从 1.4.0 版本之后,去除了 MapStruct 之外的依赖,打包后体积更小。
但当需要使用 Map
与对象转换时,需要额外引入 hutool-core
依赖包。
- 适配对象循环嵌套场景
类循环嵌套是指两个类互相引用,例如,源对象和目标对象结构都包含父对象和子对象之间的双向关联。
当存在这种情况时,直接进行转换时,会导致栈溢出的问题(stack overflow error)。
示例:
1 | java复制代码@Data |
parent
属性可以是其他类型的,可能跨越一个更长的属性链形成的嵌套循环。
为了适配这种情况,MapStructPlus 的 AutoMapper
注解中增加了 cycleAvoiding
属性,该属性用于标识,是否需要避免循环嵌套的问题。
默认为 false
,如果需要避免循环嵌套,需要将该属性设置为 true
。
当配置为 true
时,在整个对象的转换过程链路中,会传递一个 CycleAvoidingMappingContext
对象,临时保存转换生成的对象,
在转换链路中,如果发现需要生成的对象已经存在,会直接返回该类型,从而避免栈溢出问题。
以上面的示例为例,在 AutoMapper
注解中,配置 cycleAvoiding
属性为 true
,如下所示:
1 | java复制代码@Data |
编译生成的转换逻辑如下:
1 | java复制代码public TreeNodeDto convert(TreeNode arg0, CycleAvoidingMappingContext arg1) { |
AutoMapping
、ReverseAutoMapping
支持qualifiedByName
、conditionQualifiedByName
和dependsOn
属性AutoMappings
支持配置在方法上面
我是「代码笔耕」,致力于打造高效简洁、稳定可靠代码的后端开发。
本文可能存在纰漏或错误,如有问题欢迎指正,感谢您阅读这篇文章,如果觉得还行的话,不要忘记点赞、评论、收藏喔!
最后欢迎大家关注我的公众号「代码笔耕」和开源项目:easii (easii) - Gitee.com
本文转载自: 掘金