2.0 @Mapper注解详解

2016-06-10 21:24:16 94,991 2

在上一节中,我们已经看到了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实现类源码。

QQ截图20160610212311.png

可以看到自动生成的实现类中,自动帮我们添加了@Component注解。因此我们在其他地方可以通过@AutoWired的方式自动注入。