MapStruct Plus:一个注解搞定 Java 类型转换
MapStruct Plus:一个注解搞定 Java 类型转换
写 Java 的时候,对象之间的转换是个绕不开的活儿。DTO、BO、VO、Entity 来回倒腾,手写 setter 一行行拷贝,看着就累。原生的 MapStruct 解决了一部分问题,但还得自己定义 Mapper 接口,每个转换都要写一遍。MapStruct Plus 就是来把这个过程再简化一步的。
它的目标挺直接:做最简单、最强大的类型转换工具。只增强,不修改 MapStruct 本身,上手成本几乎为零。

核心就一招:注解驱动
原版 MapStruct 的用法是定义一个 Mapper 接口,方法签名写明白从哪个类转到哪个类。MapStruct Plus 把这一步省了。
在需要转换的类上加一个 @AutoMapper 注解,指定目标类型,剩下的让注解处理器去生成。代码里只要注入 Converter,调用 convert 方法就行,从哪个对象转到哪个对象,参数一传就完事。
举个小例子。两个类 User 和 UserDto,字段都一样: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-plugin 把 mapstruct-plus-processor 挂到注解处理路径上。这一步看着繁琐,其实就是把 MapStruct 的代码生成器接进来。配完以后 Converter 就是个现成的 Bean,哪儿需要哪儿注入。
非 Spring 项目也能用,只是要手动拿到 Converter 实例,文档里有说明。整体接入成本在一个 Maven 依赖加一段插件配置的程度。

相比手写和 BeanUtils 区别在哪
BeanUtils 是反射拷贝,性能低,字眼稍微不一致就拷不上,类型不匹配也只是忽略。手写转换代码性能没问题,但字段一多就全是重复劳动,改一个字段得同步改两处。
MapStruct 系列走编译期生成代码的路线,性能等同手写。原版需要写接口,MapStruct Plus 把接口也省了,写注解的就别再写一遍方法签名。从代码量来说,转换关系本身就是元数据,注解表达比接口表达更紧凑。
实际用下来,新项目接入基本零阻力。老项目要替换 BeanUtils 的话,得先把字段命名规整一下,因为 MapStruct 默认按名称匹配,字段名不一致得显式映射。
一点不足
复杂映射做不了太花的事。比如多层嵌套对象、聚合多个源对象到一个目标,这些场景还是得回到原版 MapStruct 写自定义方法。MapStruct Plus 的定位是把简单场景做到极致,复杂场景不挡路,该回退就回退。
文档主要在 mapstruct.plus 上,国内 Gitee 有镜像站点。项目本身还在持续更新,最近版本到 1.5.x,作者还在维护自己的其他开源项目,活跃度看着没问题。
适合谁用
Spring Boot 项目里 DTO 转换频繁、字段基本对得上的场景最合适。手写转换代码写到烦的同学可以试一下,几行依赖加一个注解,省下来的时间是实打实的。
老项目用 BeanUtils 用得很深的,没必要硬替换。反射那点性能损耗在你业务里要是无所谓,继续用也没毛病。新项目或者对性能敏感的部分用 MapStruct Plus,更快也更清晰。
点性能损耗在你业务里要是无所谓,继续用也没毛病。新项目或者对性能敏感的部分用 MapStruct Plus,更快也更清晰。
更多推荐




所有评论(0)