前言
通过之前的学习,我们知道MapStruct 通过映射器接口,帮我们生成了实现类对象,那么怎么引入对象用呢?主要有以下几种方式:
1. 使用Mappers 工厂(无依赖注入)
当不使用 DI (依赖注入)框架时,可以通过org.mapstruct.factory.Mappers 类检索 Mapper 实例。
映射器接口中应定义一个名为INSTANCE 的成员,该成员包含映射器类型的单个实例:
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
CarDto carToCarDto(Car car);
}
只需调用该Mappers类的getMapper()方法,传递映射器的接口类型即可返回:
CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
在抽象类中这样使用:
@Mapper
public abstract class CarMapper {
public static final CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
CarDto carToCarDto(Car car);
}
这种模式使客户端可以很容易地使用映射器对象,而无需重复实例化新实例:
Car car = ...;
CarDto dto = CarMapper.INSTANCE.carToCarDto( car );
由 MapStruct 生成的映射器是无状态的和线程安全的,因此可以同时从多个线程安全地访问。
2. 使用依赖注入
如果您正在使用依赖注入框架,例如CDI(Java TM EE 的上下文和依赖注入)或Spring 框架,建议通过依赖注入来获取映射器对象。
首先需要指定@Mapper注解 的defaultComponentModel 属性,基于该配置生成响应的映射器,该配置有以下配置项:
配置值 | 说明 |
---|
default | 映射器不使用组件模型,实例通常通过检索Mappers#getMapper(Class) | cdi | 生成的映射器是应用程序范围的 CDI bean,可以通过以下方式检索@Inject | spring | spring:生成的映射器是一个单例范围的 Spring bean,可以通过以下方式检索@Autowired | jsr330 | 生成的映射器使用 {@code @Named} 进行注释,并且可以通过@Inject(从 javax.inject 或 jakarta.inject 检索,取决于哪一个可用 javax.inject 具有优先级),例如使用 Spring | jakarta | 生成的映射器使用 {@code @Named} 进行注释,并且可以通过@Inject(来自 jakarta.inject)检索,例如使用 Spring |
示例1:使用 CDI 组件模型的映射器:
@Mapper(componentModel = MappingConstants.ComponentModel.CDI)
public interface CarMapper {
CarDto carToCarDto(Car car);
}
示例2:通过依赖注入获取映射器:
@Mapper(componentModel = "spring")
public interface CarMapper {
@Mapping(source = "driver.name", target = "driverName")
@Mapping(source = "driver", target = ".")
CarDto car2CarDto(Car car);
}
@Autowired
CarMapper carMapper;
@Test
public void testmap(){
Car car=new Car();
car.setMake("make");
car.setNumberOfSeats(100);
car.setType("type");
Driver driver=new Driver();
driver.setName("driver");
CarDto carDto =carMapper.car2CarDto(car,driver);
System.out.println(carDto);
}
使用依赖注入时,您可以在字段注入和构造函数注入之间进行选择。这可以通过@Mapper或@MapperConfig注解来完成。
示例:使用构造函数注入
@Mapper(componentModel = MappingConstants.ComponentModel.CDI, uses = EngineMapper.class, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface CarMapper {
CarDto carToCarDto(Car car);
}
目前,默认的注入策略是字段注入,mapstruct.defaultInjectionStrategy 的可配置项如下:
| |
---|
field | 字段注入 | constructor | 将生成构造函数。通过构造函数注入。 |
|