MapStruct使用教程(四)

164 阅读2分钟

映射器

前面简单介绍了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);
}