乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      干掉 BeanUtils!這款 Bean 自動(dòng)映射神器出 Spring 插件了!

       昵稱10087950 2022-06-16 發(fā)布于江蘇

      之前安利過Mapstruct 這個(gè)神器,它可以代替BeanUtil來進(jìn)行DTOVO、PO之間的轉(zhuǎn)換。它使用的是Java編譯期的  annotation processor 機(jī)制,說白了它就是一個(gè)代碼生成器,代替你手工進(jìn)行類型轉(zhuǎn)換期間的取值賦值操作。

      之前很多項(xiàng)目都使用了它,代碼清爽得很,增加了大量摸魚時(shí)間,用過的都說好。

      @Mapper(componentModel = "spring")
      public interface AreaMapping {

          List<AreaInfoListVO> toVos(List<Area> areas);
      }

      就這么幾行就把一個(gè)PO的集合轉(zhuǎn)換成了對(duì)應(yīng)VO的集合。

      // spring bean 
      @Autowired
      AreaMapping areaMapping
          
      // 轉(zhuǎn)換源 areas    
      List<Area> areas = ……;
      // 轉(zhuǎn)換目標(biāo) vos 
      List<AreaInfoListVO> vos = areaMapping.toVos(areas)

      換成你手寫試試,起碼得五分之一炷香的功夫。

      但是這樣寫還是不太爽,每次都要掛對(duì)應(yīng)的Mapper類。

      Converter

      Spring framework提供了一個(gè)Converter<S,T>接口:

      @FunctionalInterface
      public interface Converter<ST{
          @Nullable
          convert(S source);

          default <U> Converter<S, U> andThen(Converter<? super T, ? extends U> after) {
              Assert.notNull(after, "After Converter must not be null");
              return (s) -> {
                  T initialResult = this.convert(s);
                  return initialResult != null ? after.convert(initialResult) : null;
              };
          }
      }

      它的作用是將S轉(zhuǎn)換為T,這和Mapstruct的作用不謀而合。

      Converter會(huì)通過ConverterRegistry這個(gè)注冊(cè)接口注冊(cè)到ConversionService,然后你就可以通過ConversionServiceconvert方法來進(jìn)行轉(zhuǎn)換:

      <T> convert(@Nullable Object source, Class<T> targetType);

      MapStruct Spring Extensions

      根據(jù)上面的機(jī)制官方推出了MapStruct Spring Extensions插件, 它實(shí)現(xiàn)了一種機(jī)制,所有的Mapstruct映射接口(Mapper)只要實(shí)現(xiàn)了Converter,都會(huì)自動(dòng)注冊(cè)到ConversionService,我們只需要通過ConversionService就能完成任何轉(zhuǎn)換操作。

      /**
       * @author felord.cn
       * @since 1.0.0
       */

      @Mapper(componentModel = "spring")
      public interface CarMapper extends Converter<CarCarDto{

          @Mapping(target = "seats", source = "seatConfiguration")
          CarDto convert(Car car);
      }

      調(diào)用時(shí):

      @Autowired
      private ConversionService conversionService;

      Car car = ……;
      CarDto carDto = conversionService.convert(car,CarDto.class);

      MapStruct Spring Extensions 會(huì)自動(dòng)生成一個(gè)適配類處理Mapper注冊(cè):

      package org.mapstruct.extensions.spring.converter;

      import cn.felord.mapstruct.entity.Car;
      import cn.felord.mapstruct.entity.CarDto;
      import org.springframework.context.annotation.Lazy;
      import org.springframework.core.convert.ConversionService;
      import org.springframework.stereotype.Component;
      /**
       * @author felord.cn
       * @since 1.0.0
       */

      @Component
      public class ConversionServiceAdapter {
          private final ConversionService conversionService;

          public ConversionServiceAdapter(@Lazy final ConversionService conversionService) {
              this.conversionService = conversionService;
          }

          public CarDto mapCarToCarDto(final Car source) {
              return (CarDto)this.conversionService.convert(source, CarDto.class);
          }
      }

      自定義

      自定義適配類的包路徑和名稱

      默認(rèn)情況下,生成的適配類將位于包org.mapstruct.extensions.spring.converter中,名稱固定為ConversionServiceAdapter。如果你希望修改包路徑或者名稱,你可以這樣:

      package cn.felord.mapstruct.config;

      import org.mapstruct.MapperConfig;
      import org.mapstruct.extensions.spring.SpringMapperConfig;

      /**
       * @author felord.cn
       * @since 1.0.0
       */

      @MapperConfig(componentModel = "spring")
      @SpringMapperConfig(conversionServiceAdapterPackage = "cn.felord.mapstruct.config",
              conversionServiceAdapterClassName = "MapStructConversionServiceAdapter")
      public class MapperSpringConfig {
      }

      不指定conversionServiceAdapterPackage元素,生成的 Adapter 類將與注解的 Config 駐留在同一個(gè)包中,所以上面的路徑是可以省略的。

      指定ConversionService

      如果你的Spring IoC容器中有多個(gè)ConversionService,你可以通過@SpringMapperConfig注解的conversionServiceBeanName參數(shù)指定。

      package cn.felord.mapstruct.config;

      import org.mapstruct.MapperConfig;
      import org.mapstruct.extensions.spring.SpringMapperConfig;

      /**
       * @author felord.cn
       * @since 1.0.0
       */

      @MapperConfig(componentModel = "spring")
      @SpringMapperConfig(conversionServiceAdapterPackage = "cn.felord.mapstruct.config",
              conversionServiceAdapterClassName = "MapStructConversionServiceAdapter",
                         conversionServiceBeanName = "myConversionService")
      public class MapperSpringConfig {
      }

      集成Spring的內(nèi)置轉(zhuǎn)換

      Spring內(nèi)部提供了很多好用的Converter<S,T>實(shí)現(xiàn),有的并不直接開放,如果你想用Mapstruct的機(jī)制使用它們,可以通過@SpringMapperConfig注解的 externalConversions注冊(cè)它們。

      @MapperConfig(componentModel = "spring")
      @SpringMapperConfig(
         externalConversions = @ExternalConversion(sourceType = String.classtargetType = Locale.class))
      public interface MapstructConfig 
      {}

      會(huì)在適配器中自動(dòng)生成相應(yīng)的轉(zhuǎn)換:

      @Component
      public class ConversionServiceAdapter {
        private final ConversionService conversionService;

        public ConversionServiceAdapter(@Lazy final ConversionService conversionService) {
          this.conversionService = conversionService;
        }

        public Locale mapStringToLocale(final String source) {
          return conversionService.convert(source, Locale.class);
        }
      }

      總結(jié)

      mapstruct-spring-annotations 使開發(fā)人員能夠通過ConversionService使用定義的 Mapstruct 映射器,而不必單獨(dú)導(dǎo)入每個(gè) Mapper,從而允許 Mapper 之間的松散耦合。它本身不會(huì)影響Mapstruct的機(jī)制。

      項(xiàng)目源碼地址

      https:///felord/mapstruct-spring-extensions


      微信8.0將好友放開到了一萬,小伙伴可以加我大號(hào)了,先到先得,再滿就真沒了

      圖片

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多