映射器
前面简单介绍了MapStruct中有关映射器的定义和简单使用,本节将详细说说获取映射器实例的方式。
通过工厂获取映射器
当不使用DI(依赖注入)框架时,可以通过mapstruct提供的工厂类(org.mastruct.factory.Mappers)检索Mapper实例。只需调用getMapper()方法,传递映射器的接口类型即可返回:
CarMapper mapper = Mappers.getMapper( CarMapper.class );
定义映射器
可以通过接口,抽象类两种方式定义映射器。
- 通过接口方式定义一个映射器
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserConverter {
UserConverter MAPPER = Mappers.getMapper(UserConverter.class);
/**
* 默认相同名称进行隐式转换
*
* @param user
* @return
*/
UserDTO convert(User user);
}
上面示例中的成员MAPPER持有映射器UserConverter类型的单个实例。
- 通过抽象类定义一个映射器:
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
CarDto carToCarDto(Car car);
}
使用映射器
客户端通过接口/抽象类中的成员可以使用映射器,不需要重复实例化新对象。
Car car = ...;
CarDto dto = CarMapper.INSTANCE.carToCarDto( car );
注意:MapStruct生成的映射器是无状态的和线程安全的,多个线程可以安全地访问。
通过依赖注入获取映射器
如果项目中使用了DI框架比如CDI,Spring framework,那么推荐使用依赖注入方式使用映射器,通过@Mapper中的组件模型componentModel属性或者pom配置项进行设置。
- 使用CDI组件模型
@Mapper(componentModel = "cdi")
public interface CarMapper {
CarDto carToCarDto(Car car);
}
- 使用Spring组件模型
@Mapper(componentModel = "spring")
public interface UserCustomerConverter {
/**
* 默认相同名称进行隐式转换
*
* @param user
* @return
*/
UserDTO convert(User user);
/**
* 使用接口默认实现方式自定义映射
*
* @param str
* @return
*/
default String convertName(String str) {
return "customer_" + str;
}
}
通过@Mapper 或 @MapperConfig 注解可以配置注入策略(字段注入或构造器注入)
示例:使用构造器注入策略
@Mapper(componentModel = "cdi", uses = EngineMapper.class, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface CarMapper {
CarDto carToCarDto(Car car);
}