MapStruct 是一个基于 Java 注解的代码生成器,它用于在 Java Bean 类型之间自动转换。它极大地简化了对象之间的映射工作,特别是在处理复杂对象图时。MapStruct 通过在编译时生成类型安全的映射代码来避免运行时反射,从而提高了性能和类型安全性。
MapStruct 的主要特点
- 类型安全:MapStruct 在编译时生成映射代码,因此类型错误在编译时就能被发现。
- 高性能:由于映射代码是在编译时生成的,因此避免了反射带来的性能开销。
- 易于使用:通过简单的注解和接口定义,即可实现复杂的映射逻辑。
- 可扩展:支持自定义映射逻辑和表达式。
使用 MapStruct 的基本步骤
-
添加依赖:首先,你需要在你的项目中添加 MapStruct 的依赖。如果你使用 Maven,可以在
pom.xml中添加如下依赖(注意替换为最新版本):<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>你的版本号</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>你的版本号</version> <scope>provided</scope> </dependency>对于 Gradle,可以在
build.gradle文件中添加:implementation 'org.mapstruct:mapstruct:你的版本号' annotationProcessor 'org.mapstruct:mapstruct-processor:你的版本号' -
定义 Mapper 接口:创建一个接口,并使用
@Mapper注解标记它。然后,在该接口中定义映射方法。MapStruct 会自动生成这个接口的实现。 -
使用 Mapper:在你的代码中,直接注入 Mapper 接口(如果你使用 Spring,可以通过
@Autowired注入),并调用其映射方法。
使用示例
假设我们有两个简单的 Java Bean:Car 和 CarDto。
public class Car {
private String make;
private int numberOfSeats;
// 省略构造器、getter 和 setter
}
public class CarDto {
private String manufacturer;
private int seatCount;
// 省略构造器、getter 和 setter
}
我们可以定义一个 Mapper 接口来映射 Car 到 CarDto:
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(source = "make", target = "manufacturer")
@Mapping(source = "numberOfSeats", target = "seatCount")
CarDto carToCarDto(Car car);
// 如果需要,也可以定义反向映射
@Mapping(source = "manufacturer", target = "make")
@Mapping(source = "seatCount", target = "numberOfSeats")
Car carDtoToCar(CarDto carDto);
}
在这个例子中,@Mapping 注解用于指定源属性和目标属性之间的映射关系。MapStruct 会自动生成 CarMapper 接口的实现,并在编译时生成映射代码。
注意事项
-
确保你的 IDE 或构建工具(如 Maven 或 Gradle)配置了注解处理器,以便在编译时生成 MapStruct 的实现代码。
-
MapStruct 生成的代码是依赖于你的 Mapper 接口定义的,因此任何对 Mapper 接口的修改都需要重新编译项目。
-
MapStruct 支持复杂的映射逻辑,包括嵌套对象、集合、条件映射等。你可以通过自定义方法、表达式或
@AfterMapping、@BeforeMapping注解来扩展映射逻辑。
更多资源请关注微信公众号:IT技术馆