Mapstruct可以代替BeanUtil来进行DTO、VO、PO之间的转换。它使用的是Java编译期的annotationprocessor机制,说白了它就是一个代码生成器,代替你手工进行类型转换期间的取值赋值操作。 小编很多项目都使用了它,代码清爽得很,增加了大量摸鱼时间,用过的都说好。Mapper(componentModelspring)publicinterfaceAreaMapping{ListtoVos(Listareas);} 就这么几行就把一个PO的集合转换成了对应VO的集合。springbeanAutowiredAreaMappingareaMapping转换源areasListareas;转换目标vosListvosareaMapping。toVos(areas) 换成你手写试试,起码得五分之一炷香的功夫。 但是这样写还是不太爽,每次都要挂对应的Mapper类。Converter Springframework提供了一个ConverterS,T接口:FunctionalInterfacepublicinterfaceConverterS,T{NullableTconvert(Ssource);defaultUConverterS,UandThen(Converterlt;?superT,?extendsUafter){Assert。notNull(after,AfterConvertermustnotbenull);return(s){TinitialResultthis。convert(s);returninitialResult!null?after。convert(initialResult):null;};}} 它的作用是将S转换为T,这和Mapstruct的作用不谋而合。 Converter会通过ConverterRegistry这个注册接口注册到ConversionService,然后你就可以通过ConversionService的convert方法来进行转换:TTconvert(NullableObjectsource,ClassTtargetType);MapStructSpringExtensions 根据上面的机制官方推出了MapStructSpringExtensions插件,它实现了一种机制,所有的Mapstruct映射接口(Mapper)只要实现了Converter,都会自动注册到ConversionService,我们只需要通过ConversionService就能完成任何转换操作。authorfelord。cnsince1。0。0Mapper(componentModelspring)publicinterfaceCarMapperextendsConverterCar,CarDto{Mapping(targetseats,sourceseatConfiguration)CarDtoconvert(Carcar);} 调用时:AutowiredprivateConversionServiceconversionService;Carcar;CarDtocarDtoconversionService。convert(car,CarDto。class); MapStructSpringExtensions会自动生成一个适配类处理Mapper注册:packageorg。mapstruct。extensions。spring。converter;importcn。felord。mapstruct。entity。Car;importcn。felord。mapstruct。entity。CarDto;importorg。springframework。context。annotation。Lazy;importorg。springframework。core。convert。ConversionService;importorg。springframework。stereotype。Component;authorfelord。cnsince1。0。0ComponentpublicclassConversionServiceAdapter{privatefinalConversionServiceconversionService;publicConversionServiceAdapter(LazyfinalConversionServiceconversionService){this。conversionServiceconversionService;}publicCarDtomapCarToCarDto(finalCarsource){return(CarDto)this。conversionService。convert(source,CarDto。class);}}自定义自定义适配类的包路径和名称 默认情况下,生成的适配类将位于包org。mapstruct。extensions。spring。converter中,名称固定为ConversionServiceAdapter。如果你希望修改包路径或者名称,你可以这样:packagecn。felord。mapstruct。config;importorg。mapstruct。MapperConfig;importorg。mapstruct。extensions。spring。SpringMapperConfig;authorfelord。cnsince1。0。0MapperConfig(componentModelspring)SpringMapperConfig(conversionServiceAdapterPackagecn。felord。mapstruct。config,conversionServiceAdapterClassNameMapStructConversionServiceAdapter)publicclassMapperSpringConfig{} 不指定conversionServiceAdapterPackage元素,生成的Adapter类将与注解的Config驻留在同一个包中,所以上面的路径是可以省略的。指定ConversionService 如果你的SpringIoC容器中有多个ConversionService,你可以通过SpringMapperConfig注解的conversionServiceBeanName参数指定。packagecn。felord。mapstruct。config;importorg。mapstruct。MapperConfig;importorg。mapstruct。extensions。spring。SpringMapperConfig;authorfelord。cnsince1。0。0MapperConfig(componentModelspring)SpringMapperConfig(conversionServiceAdapterPackagecn。felord。mapstruct。config,conversionServiceAdapterClassNameMapStructConversionServiceAdapter,conversionServiceBeanNamemyConversionService)publicclassMapperSpringConfig{}集成Spring的内置转换 Spring内部提供了很多好用的ConverterS,T实现,有的并不直接开放,如果你想用Mapstruct的机制使用它们,可以通过SpringMapperConfig注解的externalConversions注册它们。MapperConfig(componentModelspring)SpringMapperConfig(externalConversionsExternalConversion(sourceTypeString。class,targetTypeLocale。class))publicinterfaceMapstructConfig{} 会在适配器中自动生成相应的转换:ComponentpublicclassConversionServiceAdapter{privatefinalConversionServiceconversionService;publicConversionServiceAdapter(LazyfinalConversionServiceconversionService){this。conversionServiceconversionService;}publicLocalemapStringToLocale(finalStringsource){returnconversionService。convert(source,Locale。class);}}总结 mapstructspringannotations使开发人员能够通过ConversionService使用定义的Mapstruct映射器,而不必单独导入每个Mapper,从而允许Mapper之间的松散耦合。,它本身不会影响Mapstruct的机制。 来源:https:mp。weixin。qq。coms2W4OwmSp3ZGFkvEKWQQYdw