文章目录
4.获取映射器
4.1. Mappers工厂(无依赖注入)
当不使用依赖注入框架时,可以通过org.mapstruct.factory.Mappers类获取映射器实例。只需调用getMapper()方法,并传入要返回的映射器接口类型:
示例1. 使用Mappers工厂
CarMapper mapper = Mappers.getMapper(CarMapper.class);
示例2. 声明映射器实例(接口)
按照惯例,映射器接口应定义一个名为INSTANCE的成员,它保存映射器类型的单个实例
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
CarDto carToCarDto(Car car);
}
示例3. 声明映射器实例(抽象类)
@Mapper
public abstract class CarMapper {
public static final CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
CarDto carToCarDto(Car car);
}
这种模式使得客户端可以轻松使用映射器对象,而无需重复实例化新的实例
示例4. 访问映射器
Car car = ...;
CarDto dto = CarMapper.INSTANCE.carToCarDto( car );
请注意,由MapStruct生成的映射器是无状态且线程安全的,因此可以安全地从多个线程同时访问。
4.2. 使用依赖注入
如果您正在使用诸如CDI
(Java EE的上下文和依赖注入)或Spring框架之类的依赖注入
框架,建议通过依赖注入获取映射器对象,而不是使用上述的Mappers类。为此,您可以通过@Mapper#componentModel
指定生成的映射器类应基于的组件模型,或者使用处理器选项如配置选项中所述。
示例5. 使用CDI组件模型的映射器
对于spring注入,只需要设置参数
componentModel = MappingConstants.ComponentModel.SPRING
即可。
@Mapper(componentModel = MappingConstants.ComponentModel.CDI)
public interface CarMapper {
CarDto carToCarDto(Car car);
}
生成的映射器实现类将标有
@ApplicationScoped
注解,因此可以使用@Inject
注解将其注入到字段、构造函数参数等中:
示例6. 通过依赖注入获取映射器
@Inject
private CarMapper mapper;
使用其他映射器的映射器(参见调用其他映射器)将使用配置的组件模型获取这些映射器。因此,如果前面示例中的CarMapper使用了另一个映射器,则该映射器也必须是可注入的CDI bean。
4.3. 注入策略
在使用依赖注入时,您可以选择字段注入或构造函数注入。可以通过
@Mapper
或@MapperConfig
注解来提供注入策略。
示例7. 使用构造函数注入
@Mapper(componentModel = MappingConstants.ComponentModel.CDI, uses = EngineMapper.class, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface CarMapper {
CarDto carToCarDto(Car car);
}
生成的映射器将在需要使用给定映射器实例的映射时注入uses属性中定义的类。当使用InjectionStrategy#CONSTRUCTOR时,构造函数将有适当的注解,而字段则没有。当使用InjectionStrategy#FIELD时,注解位于字段本身上。目前,默认的注入策略是字段注入,但可以通过配置选项进行配置。建议使用构造函数注入以简化测试。
对于抽象类或装饰器,应使用setter注入。