在java开发中,对象之间的转换是一项常见的任务。通常有2种做法:手写和使用JavaBeanUtils。前者降低工作效率还容易出错,而后者因为使用了反射又会导致性能下降。为了解决这个问题,java社区出现了Mapstruct框架。它是一个强大的代码生成器,在编译时生成代码,使对象间的映射变得简单、高效和高性能,降低了维护成本。
Mapstruct通过注解处理器集成到构件工具和IDE中,简化了集成。
引入#
jar包依赖,如果lombok和mapstruct配合使用,一定注意此配置中的注释。因这两个都是使用注解处理器在编译时运行,并且通过annotationProcessorPaths强制规定注解处理的顺序。保证了编译的时候一定按此顺序运行。
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<!-- lombok dependency should not end up on classpath -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>17</source>
<target>17</target>
<annotationProcessorPaths>
<!-- 以下path必须固定顺序 -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<!-- additional annotation processor required as of Lombok 1.18.16 -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>xml安装插件#
搜索MapStruct Support安装即可,可以在使用MapStruct时获得更加丰富代码提示。
简单示例#
定义两个类做转换
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructorpublic
class UserPo {
private Long id;
private Date gmtCreate;
private Date createTime;
private Long buyerId;
private Long age;
private String userNick;
private String userVerified;
}
@Data
publicclass UserEntity {
private Long id;
private Date gmtCreate;
private Date createTime;
private Long buyerId;
private Long age;
private String userNick;
private String userVerified;
}java定义转换接口,后续直接通过spring注入UserConverter即可使用。
import org.mapstruct.Mapper;
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) //此处的model是mapstruct的,并且将UserConverter注入到了spring容器中
public interface UserConverter {
UserEntity po2entity(UserPo userPo);
}java总结#
1、mapstruct与lombok配合使用,一定注意导包的问题。搭配IDE插件,使用起来更方便
2、本文只讲了一些基础的使用,其他深入的使用,可以参考其官网 https://mapstruct.org/ ↗ 或者 https://juejin.cn/post/6956190395319451679 ↗