MapStruct Plus:一个注解搞定 Java 类型转换

写 Java 的时候,对象之间的转换是个绕不开的活儿。DTO、BO、VO、Entity 来回倒腾,手写 setter 一行行拷贝,看着就累。原生的 MapStruct 解决了一部分问题,但还得自己定义 Mapper 接口,每个转换都要写一遍。MapStruct Plus 就是来把这个过程再简化一步的。

它的目标挺直接:做最简单、最强大的类型转换工具。只增强,不修改 MapStruct 本身,上手成本几乎为零。

正文顶部截图

核心就一招:注解驱动

原版 MapStruct 的用法是定义一个 Mapper 接口,方法签名写明白从哪个类转到哪个类。MapStruct Plus 把这一步省了。

在需要转换的类上加一个 @AutoMapper 注解,指定目标类型,剩下的让注解处理器去生成。代码里只要注入 Converter,调用 convert 方法就行,从哪个对象转到哪个对象,参数一传就完事。

举个小例子。两个类 UserUserDto,字段都一样:username、age、young。在 User 上标一句:

@AutoMapper(target = UserDto.class)
public class User {
    // ...
}

测试代码里直接:

@Autowired
private Converter converter;

UserDto userDto = converter.convert(user, UserDto.class);

字段对得上就自动映射,对不上可以走 MapStruct 原有的字段映射注解,不冲突。反向转换也支持,只要在 UserDto 上再加一个注解指向 User,双向都能用。

Spring Boot 接入

引入 mapstruct-plus-spring-boot-starter 依赖,再配 maven-compiler-pluginmapstruct-plus-processor 挂到注解处理路径上。这一步看着繁琐,其实就是把 MapStruct 的代码生成器接进来。配完以后 Converter 就是个现成的 Bean,哪儿需要哪儿注入。

非 Spring 项目也能用,只是要手动拿到 Converter 实例,文档里有说明。整体接入成本在一个 Maven 依赖加一段插件配置的程度。

README区域截图

相比手写和 BeanUtils 区别在哪

BeanUtils 是反射拷贝,性能低,字眼稍微不一致就拷不上,类型不匹配也只是忽略。手写转换代码性能没问题,但字段一多就全是重复劳动,改一个字段得同步改两处。

MapStruct 系列走编译期生成代码的路线,性能等同手写。原版需要写接口,MapStruct Plus 把接口也省了,写注解的就别再写一遍方法签名。从代码量来说,转换关系本身就是元数据,注解表达比接口表达更紧凑。

实际用下来,新项目接入基本零阻力。老项目要替换 BeanUtils 的话,得先把字段命名规整一下,因为 MapStruct 默认按名称匹配,字段名不一致得显式映射。

一点不足

复杂映射做不了太花的事。比如多层嵌套对象、聚合多个源对象到一个目标,这些场景还是得回到原版 MapStruct 写自定义方法。MapStruct Plus 的定位是把简单场景做到极致,复杂场景不挡路,该回退就回退。

文档主要在 mapstruct.plus 上,国内 Gitee 有镜像站点。项目本身还在持续更新,最近版本到 1.5.x,作者还在维护自己的其他开源项目,活跃度看着没问题。

适合谁用

Spring Boot 项目里 DTO 转换频繁、字段基本对得上的场景最合适。手写转换代码写到烦的同学可以试一下,几行依赖加一个注解,省下来的时间是实打实的。

老项目用 BeanUtils 用得很深的,没必要硬替换。反射那点性能损耗在你业务里要是无所谓,继续用也没毛病。新项目或者对性能敏感的部分用 MapStruct Plus,更快也更清晰。

点性能损耗在你业务里要是无所谓,继续用也没毛病。新项目或者对性能敏感的部分用 MapStruct Plus,更快也更清晰。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐