MapStruct中文文档(二)——获取映射器

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注入。

猜你喜欢

转载自blog.csdn.net/hurtseverywhere/article/details/131807194