在上一节中,我们已经看到了MapStruct可以帮助我们自动根据一个添加@Mapper注解的接口生成一个实现类,在上一节的案例中,自动生成的是CarMapperImpl.class,而且我们也已经通过IDE的反编译功能查看了其源码。
本节我们将会对@Mapper注解进行一些讲解。
1、@Mapper注解的componentModel属性
componentModel属性用于指定自动生成的接口实现类的组件类型。这个属性支持四个值:
default: 这是默认的情况,mapstruct不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。
cdi: the generated mapper is an application-scoped CDI bean and can be retrieved via @Inject
spring: 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入
jsr330: 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取。
我们以spring组件方式进行验证,将上一节的CarMapper接口上@Mapper注解添加componentModel属性,如下:
//设置组件模型为Spring
@Mapper(componentModel = "spring")
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
@Mapping(source = "numberOfSeats", target = "seatCount")
CarDto carToCarDto(Car car);
}
需要注意的是,当指定组件模型为Spring的时候,我们在classpath下一定要引入spring的jar包,否则MapStruct在编译的时候会报错。
现在再次执行"mvn compile",通过IDE反编译功能查看自动生成的Mapper实现类源码。
可以看到自动生成的实现类中,自动帮我们添加了@Component注解。因此我们在其他地方可以通过@AutoWired的方式自动注入。