范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

干掉BeanUtils!这款Bean自动映射神器出Spring插件了

  之前安利过Mapstruct 这个神器,它可以代替  BeanUtil  来进行 DTO  、 VO  、 PO  之间的转换。它使用的是Java编译期的 annotation processor 机制,说白了它就是一个代码生成器,代替你手工进行类型转换期间的取值赋值操作。
  之前很多项目都使用了它,代码清爽得很,增加了大量摸鱼时间,用过的都说好。  @Mapper(componentModel = "spring") public interface AreaMapping {      List toVos(List areas); }
  就这么几行就把一个 PO 的集合转换成了对应 VO 的集合。  // spring bean  @Autowired AreaMapping areaMapping      // 转换源 areas     List areas = ……; // 转换目标 vos  List vos = areaMapping.toVos(areas)
  换成你手写试试,起码得五分之一炷香的功夫。
  但是这样写还是不太爽,每次都要挂对应的Mapper类。  Converter
  Spring framework 提供了一个 Converter 接口: @FunctionalInterface public interface Converter {     @Nullable     T convert(S source);      default  Converter 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 转换为T ,这和Mapstruct的作用不谋而合。
  Converter 会通过ConverterRegistry 这个注册接口注册到ConversionService ,然后你就可以通过ConversionService 的convert 方法来进行转换:  T convert(@Nullable Object source, Class targetType); MapStruct Spring Extensions
  根据上面的机制官方推出了 MapStruct Spring Extensions 插件, 它实现了一种机制,所有的 Mapstruct 映射接口( Mapper )只要实现了 Converter ,都会自动注册到ConversionService ,我们只需要通过ConversionService 就能完成任何转换操作。 /**  * @author felord.cn  * @since 1.0.0  */ @Mapper(componentModel = "spring") public interface CarMapper extends Converter {      @Mapping(target = "seats", source = "seatConfiguration")     CarDto convert(Car car); }
  调用时:  @Autowired private ConversionService conversionService;  Car car = ……; CarDto carDto = conversionService.convert(car,CarDto.class);
  MapStruct Spring Extensions  会自动生成一个适配类处理 Mapper 注册:  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);     } } 自定义自定义适配类的包路径和名称
  默认情况下,生成的适配类将位于包 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 驻留在同一个包中,所以上面的路径是可以省略的。  指定ConversionService
  如果你的 Spring IoC 容器中有多个 ConversionService ,你可以通过@SpringMapperConfig 注解的conversionServiceBeanName 参数指定。 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的内置转换
  Spring 内部提供了很多好用的 Converter 实现,有的并不直接开放,如果你想用Mapstruct的机制使用它们,可以通过@SpringMapperConfig 注解的 externalConversions 注册它们。 @MapperConfig(componentModel = "spring") @SpringMapperConfig(    externalConversions = @ExternalConversion(sourceType = String.class, targetType = Locale.class)) public interface MapstructConfig {}
  会在适配器中自动生成相应的转换:  @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);   } } 总结
  mapstruct-spring-annotations  使开发人员能够通过 ConversionService 使用定义的Mapstruct 映射器,而不必单独导入每个 Mapper,从而允许 Mapper 之间的松散耦合。它本身不会影响Mapstruct的机制。 项目源码地址
  https://gitee.com/felord/mapstruct-spring-extensions

入门电竞屏如何?泰坦军团大金刚T27FG试用屏幕我是用过不少了,用来用去发现性能和钱包投入成正比,有钱随便买,没钱就得看着点买,这次入手的是泰坦军团大金刚T27FG,定位为一款入门级电竞显示器。采用的是一块27英寸169的I大不一定臃肿,大尺寸电脑装机秀l前言Helloeveryone!这里是小歪,欢迎大家又来看我装机了。这两年机电厂商一直在机箱造型上发力颇勇,已经完全不满足于基本需求,开始想个性化,夸张化发展。这其中台系厂商一直70块的笔记本网卡,值不值得换l前言WiFi6出来已经有段时间了,一直想尝试一下,但苦于没啥借口升级,所以一直在观望中。直到小米出了AX3600这款平民版的高端路由器,让我有了升级的动力,果断下手购买之。正好我使命召唤战区这么火,哪一张显卡玩最适合?(AMD篇)横评测试的思路战区实际上有大逃杀和夺金两种模式的,但是地图还是同一张地图,所以无论是哪种模式并不影响游戏帧数(在NVIDIA篇中有对比说明),而且由于多人游戏不确定性导致的帧率变动MIUI12发布,隐私安全问题重回人们视线2020年4月27日,小米举办了小米10青春版的新品发布会。发布会上着重推出MIUI12,并获得了一致好评。甚至有人开玩笑说,小米10青春版就是买系统送手机。MIUI12的广受好评为了打游戏,我又升级了一块1T的固态硬盘WDBlueSN550l前言前阵子测使命召唤战区,发现现在的新游戏容量是真大,纯多人游戏的使命召唤战区94G了,如果是带上单机剧情的,那就得2300G了,一块512G的SSD也就能装个34个单机大作,升涅槃重生后的旗舰,美加狮RATPROX3至尊版鼠标评测前言作为一个曾经在高端外设领域里叱咤多年的老牌厂商,赛钛客或者叫美加狮一直是众多外设玩家中心高高在上的明珠,尤其是那强大到BT的个性化配件,至今鲜有品牌可以模仿,当然除了性能以外,智商税还是按摩神器?筋膜枪使用体验筋膜枪这个18年开始崭露头角,近两年红遍健身运动圈的神器产物,总是被大家冠以智商税的美名,特别是这两年张大妈上促销不到百元的产品层出不穷,这人很多人产生怀疑,这玩意有用吗?夸张的说高效运行还低功耗,联发科天玑高能效AI技术全面解读犹如蒸汽时代的蒸汽机电气时代的发电机信息时代的计算机手机和互联网,AI技术正成为推动人类进入智能时代的决定性气力。联发科在近日展示了一系列的天玑旗舰技术,其中高能效AI颇为抢眼。当知产晨报华为VR头戴显示器专利获授权,腾讯申请鹅mazing商标9月17日知识产权快讯1hr专利华为VR头戴显示器专利获授权,用于虚拟现实系统9月14日,华为技术有限公司获得一种头戴显示器和虚拟现实系统专利授权,公告号为CN111694152B一加realme小米全都采用联发科天玑开放架构,打造旗舰机差异化联发科以旗舰技术领先优势,再次成为业内焦点。今年夏天,联发科推出了天玑5G开放架构,助力终端厂商打造具备差异化体验的高端5G手机。到了2021年最后一季度,我们回顾该技术的最新进展
比特币的主导地位随着山寨币的反弹而回来,又一次下跌?比特币(BTC)在过去两天的市场主导地位急剧下降,因为最新的加密货币反弹变得更加倾向于山寨币。机构购买和对赌住的兴趣似乎引发了反弹。周六,BTC的市场主导地位为40。9,较周四的4行业动态TCL华星首座海外工厂出货三星国际形势影响下显示行情复杂财联社(深圳,记者王碧微)讯,近期,TCL科技(000100。SZ)子公司TCL华星宣布印度华星首批产品成功出货三星,为三星手机产品提供屏幕。TCL华星COO赵军在媒体会上向记者表日本将帮助车企避免智能网联汽车专利纠纷来源盖世汽车谭璇盖世汽车讯据外媒报道,日本政府将制定一份指导方针,帮助企业在开发智能网联汽车的过程中避免专利诉讼,这是企业在开发智能网联汽车时面临的主要风险之一。日本经济产业省的指新能源车是否会出现一次灾难性产能过剩?来源南方plus新能源的整车特别是乘用车将会出现一次灾难性的产能过剩!4月1日,潍柴集团董事长谭旭光说道。这句话不是危言耸听。截至2021年底,全国乘用车产能合计4089万辆,产能在造车的江湖上,华为的传说还能坚持多久?4月初公布交付成绩的问界M5,将成为华为造车的最大变数。国内造车圈有许多未解之谜。其中关于华为到底造不造车的话题,看似早有官方定论,但依然让人猜测不透。在最近的华为年报发布会上,华星越L雷神HiX油电混动版上市,中国汽车开始加速超车!24年前没人看好吉利汽车,24年后没人敢小瞧吉利汽车。从摸着石头过河到自主品牌头部车企,除了吉利坚韧不屈的顽强毅力,也离不开越来越出色的产品实力。随着CMA架构导入,在三大件上完全中国系统社区微脑解决方案给城市居民稳稳地幸福来源三峡晚报社区作为城市治理的基础单元,说大不大说小也不小,一方面,它承载了城市居民的衣食住行,是人们日常生活最重要的空间另一方面,社区作为城市开展社会管理与服务工作的最后一公里,投影机有望打开这个200亿市场全新车载投影有望入市提到投影机,大家总能蹦出来一些关键词,例如护眼大画面便携看大片家庭娱乐等等。相比彩电,投影机更具可玩性,这是一个富有温度乐趣的新一代科技产品。特别是Z世代下的年轻消费者,投影机成为特斯拉站稳了,四辆新车冲你而来,颜值和实力能打,这次分胜负?由于燃油价格居高不下,使得当前国内市场新能源车关注度越来越高,特别是纯电动车产品,很多人愿意给次机会,所以需求高了,涉及其中的车企也多了。论起纯电动车影响力,国产车品牌多是在20万新能源汽车充电器烧了影响车子吗新能源汽车充电器烧了影响车子,电池满放满充很容易造成电池过放或过充。而过放过充不仅会使电池容量变小,缩短电池使用寿命,而且还可能造成电池燃烧。因此,从这个角度出发,经常以浅放浅充的俄罗斯军用无人机里全是欧美半导体大厂的芯片,这说明了什么?2014年因为克里米亚问题,俄罗斯就已经被制裁了,但2016年俄军使用的无人机上还是能找到来源不明的美国芯片,专家直言这些来源不明的芯片,各生产厂家其实已经具备识别技术,只待公私部