幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

用了这个工具后,再也不写gettersetter了

  作者:DrLauPen链接:https:juejin。cnpost7103135968256851976前言
  相信绝大多数的业务开发同学,日常的工作都离不开写getter、setter方法。要么是将下游的RPC结果通过getter、setter方法进行获取组装。要么就是将自己系统内部的处理结果通过getter、setter方法处理成前端所需要的VO对象。publicUserInfoVOoriginalCopyItem(UserDTOuserDTO){UserInfoVOuserInfoVOnewUserInfoVO();userInfoVO。setUserName(userDTO。getName());userInfoVO。setAge(userDTO。getAge());userInfoVO。setBirthday(userDTO。getBirthday());userInfoVO。setIdCard(userDTO。getIdCard());userInfoVO。setGender(userDTO。getGender());userInfoVO。setIsMarried(userDTO。getIsMarried());userInfoVO。setPhoneNumber(userDTO。getPhoneNumber());userInfoVO。setAddress(userDTO。getAddress());returnuserInfoVO;}
  传统的方法一般是采用硬编码,将每个对象的值都逐一设值。当然为了偷懒也会有采用一些BeanUtil简约代码的方式:publicUserInfoVOutilCopyItem(UserDTOuserDTO){UserInfoVOuserInfoVOnewUserInfoVO();采用反射、内省机制实现拷贝BeanUtils。copyProperties(userDTO,userInfoVO);returnuserInfoVO;}
  但是,像BeanUtils这类通过反射、内省等实现的框架,在速度上会带来比较严重的影响。尤其是对于一些大字段、大对象而言,这个速度的缺陷就会越明显。针对速度这块我还专门进行了测试,对普通的setter方法、BeanUtils的拷贝以及本次需要介绍的mapperStruct进行了一次对比。得到的耗时结果如下所示:(具体的运行代码请见附录)
  运行次数setter方法耗时BeanUtils拷贝耗时MapperStruct拷贝耗时12921528(1)3973292(1。36)2989942(1。023)102362724(1)66402953(28。10)3348099(1。417)1002500452(1)71741323(28。69)2120820(0。848)10003187151(1)157925125(49。55)5456290(1。711)100005722147(1)300814054(52。57)5229080(0。913)10000019324227(1)244625923(12。65)12932441(0。669)
  以上单位均为毫微秒。括号内的为当前组件同Setter比较的比值。可以看到BeanUtils的拷贝耗时基本为setter方法的十倍、二十倍以上。而MapperStruct方法拷贝的耗时,则与setter方法相近。由此可见,简单的BeanUtils确实会给服务的性能带来很大的压力。而MapperStruct拷贝则可以很好的解决这个问题。
  下面我们就来介绍一下MapperStruct这个能够很好提升我们代码效率的工具。使用教程maven依赖
  首先要导入mapStruct的maven依赖,这里我们选择最新的版本1。5。0。RC1。。。。propertiesorg。mapstruct。version1。5。0。RC1org。mapstruct。versionproperties。。。mapStructmaven依赖dependenciesdependencygroupIdorg。mapstructgroupIdmapstructartifactIdversion{org。mapstruct。version}versiondependencydependencies。。。编译的组件需要配置buildpluginsplugingroupIdorg。apache。maven。pluginsgroupIdmavencompilerpluginartifactIdversion3。8。1versionconfigurationsource1。8source!dependingonyourprojecttarget1。8target!dependingonyourprojectpathgroupIdorg。mapstructgroupIdmapstructprocessorartifactIdversion{org。mapstruct。version}versionpath!otherannotationprocessorsannotationProcessorPathsconfigurationpluginpluginsbuild
  在引入maven依赖后,我们首先来定义需要转换的DTO及VO信息,主要包含的信息是名字、年龄、生日、性别等信息。DatapublicclassUserDTO{privateStringname;privateintage;privateDatebirthday;1男0女privateintgender;privateStringidCard;privateStringphoneNumber;privateStringaddress;privateBooleanisMarried;}DatapublicclassUserInfoVO{privateStringuserName;privateintage;privateDatebirthday;1男0女privateintgender;privateStringidCard;privateStringphoneNumber;privateStringaddress;privateBooleanisMarried;}
  紧接着需要编写相应的mapper类,以便生成相应的编译类。MapperpublicinterfaceInfoConverter{InfoConverterINSTANTMappers。getMapper(InfoConverter。class);Mappings({Mapping(sourcename,targetuserName)})UserInfoVOconvert(UserDTOuserDto);}
  需要注意的是,因为DTO中的name对应的其实是VO中的userName。因此需要在converter中显式声明。在编写完对应的文件之后,需要执行maven的complie命令使得IDE编译生成对应的Impl对象。(自动生成)
  到此,mapperStruct的接入就算是完成了。我们就可以在我们的代码中使用这个拷贝类了。publicUserInfoVOnewCopyItem(UserDTOuserDTO,inttimes){UserInfoVOuserInfoVOnewUserInfoVO();userInfoVOInfoConverter。INSTANT。convert(userDTO);returnuserInfoVO;}
  怎么样,接入是不是很简单FAQ
  1、接入项目时,发现并没有生成对应的编译对象class,这个是什么原因?
  答:可能的原因有如下几个:忘记编写对应的Mapper注解,因而没有生成没有配置上述提及的插件mavencompilerplugin没有执行maven的Compile,IDE没有进行相应编译
  2、接入项目后发现,我项目内的Lombok、Data注解不好使了,这怎么办呢?
  由于Lombok本身是对AST进行修改实现的,但是mapStruct在执行的时候并不能检测到Lombok所做的修改,因此需要额外的引入maven依赖lombokmapstructbinding。。。。。。。org。mapstruct。version1。5。0。RC1org。mapstruct。versionlombokmapstructbinding。version0。2。0lombokmapstructbinding。versionlombok。version1。18。20lombok。version。。。。。。。。。。。。dependencygroupIdorg。mapstructgroupIdmapstructartifactIdversion{org。mapstruct。version}versiondependencydependencygroupIdorg。projectlombokgroupIdlombokmapstructbindingartifactIdversion{lombokmapstructbinding。version}versiondependencydependencygroupIdorg。projectlombokgroupIdlombokartifactIdversion{lombok。version}versiondependency
  更详细的,mapperStruct在官网中还提供了一个实现Lombok及mapStruct同时并存的案例
  3、更多问题:
  欢迎查看MapStruct官网文档,里面对各种问题都有更详细的解释及解答。实现原理
  在聊到mapstruct的实现原理之前,我们就需要先回忆一下JAVA代码运行的过程。大致的执行生成的流程如下所示:
  可以直观的看到,如果我们想不通过编码的方式对程序进行修改增强,可以考虑对抽象语法树进行相应的修改。而mapstruct也正是如此做的。具体的执行逻辑如下所示:
  为了实现该方法,mapstruct基于JSR269实现了代码。JSR269是JDK引进的一种规范。有了它,能够在编译期处理注解,并且读取、修改和添加抽象语法树中的内容。JSR269使用AnnotationProcessor在编译期间处理注解,AnnotationProcessor相当于编译器的一种插件,因此又称为插入式注解处理。想要实现JSR269,主要有以下几个步骤:继承AbstractProcessor类,并且重写process方法,在process方法中实现自己的注解处理逻辑。在METAINFservices目录下创建javax。annotation。processing。Processor文件注册自己实现的AnnotationProcessor。
  通过实现AbstractProcessor,在程序进行compile的时候,会对相应的AST进行修改。从而达到目的。publicvoidcompile(ListJavaFileObjectsourceFileObjects,ListStringclassnames,Iterablelt;?extendsProcessorprocessors){if(processors!nullprocessors。iterator()。hasNext())explicitAnnotationProcessingRequestedtrue;asaJavaCompilercanonlybeusedonce,throwanexceptionifithasbeenusedbefore。if(hasBeenUsed)thrownewAssertionError(attempttoreuseJavaCompiler);hasBeenUsedtrue;forciblysettheequivalentofXlint:options,sothatnofurtherwarningsaboutcommandlineoptionsaregeneratedfromthispointonoptions。put(XLINTCUSTOM。textLintCategory。OPTIONS。option,true);options。remove(XLINTCUSTOM。textLintCategory。OPTIONS。option);startmsecnow();try{initProcessAnnotations(processors);此处会调用到mapStruct中的processor类的方法。delegateCompilerprocessAnnotations(enterTrees(stopIfError(CompileState。PARSE,parseFiles(sourceFileObjects))),classnames);delegateCompiler。compile2();delegateCompiler。close();elapsedmsecdelegateCompiler。elapsedmsec;}catch(Abortex){if(devVerbose)ex。printStackTrace(System。err);}finally{if(procEnvImpl!null)procEnvImpl。close();}}
  关键代码,在mapstructprocessor包中,有个对应的类MappingProcessor继承了AbstractProcessor,并实现其process方法。通过对AST进行相应的代码增强,从而实现对最终编译的对象进行修改的方法。SupportedAnnotationTypes({org。mapstruct。Mapper})SupportedOptions({mapstruct。suppressGeneratorTimestamp,mapstruct。suppressGeneratorVersionInfoComment,mapstruct。unmappedTargetPolicy,mapstruct。unmappedSourcePolicy,mapstruct。defaultComponentModel,mapstruct。defaultInjectionStrategy,mapstruct。disableBuilders,mapstruct。verbose})publicclassMappingProcessorextendsAbstractProcessor{publicbooleanprocess(Setlt;?extendsTypeElementannotations,RoundEnvironmentroundEnvironment){if(!roundEnvironment。processingOver()){RoundContextroundContextnewRoundContext(this。annotationProcessorContext);SetTypeElementdeferredMappersthis。getAndResetDeferredMappers();this。processMapperElements(deferredMappers,roundContext);SetTypeElementmappersthis。getMappers(annotations,roundEnvironment);this。processMapperElements(mappers,roundContext);}elseif(!this。deferredMappers。isEmpty()){Iteratorvar8this。deferredMappers。iterator();while(var8。hasNext()){MappingProcessor。DeferredMapperdeferredMapper(MappingProcessor。DeferredMapper)var8。next();TypeElementdeferredMapperElementdeferredMapper。deferredMapperElement;ElementerroneousElementdeferredMapper。erroneousElement;StringerroneousElementName;if(erroneousElementinstanceofQualifiedNameable){erroneousElementName((QualifiedNameable)erroneousElement)。getQualifiedName()。toString();}else{erroneousElementNameerroneousElement!null?erroneousElement。getSimpleName()。toString():null;}deferredMapperElementthis。annotationProcessorContext。getElementUtils()。getTypeElement(deferredMapperElement。getQualifiedName());this。processingEnv。getMessager()。printMessage(Kind。ERROR,NoimplementationwascreatedfordeferredMapperElement。getSimpleName()duetohavingaproblemintheerroneouselementerroneousElementName。Hint:thisoftenmeansthatsomeotherannotationprocessorwassupposedtoprocesstheerroneouselement。YoucanalsoenableMapStructverbosemodebysettingAmapstruct。verbosetrueasacompilationargument。,deferredMapperElement);}}returnfalse;}}
  如何断点调试:
  因为这个注解处理器是在解析编译的过程完成,跟普通的jar包调试不太一样,maven框架为我们提供了调试入口,需要借助maven才能实现debug。所以需要在编译过程打开debug才可调试。在项目的pom文件所在目录执行mvnDebugcompile接着用idea打开项目,添加一个remote,端口为8000打上断点,debug运行remote即可调试。
  附录
  测试代码如下,采用Spock框架JAVA代码实现。Spock框架作为当前最火热的测试框架,你值得学习一下。Spock框架初体验:更优雅地写好你的单元测试ResourceSharedMapperStructServicemapperStructServicedefsetupSpec(){mapperStructServicenewMapperStructService()}UnrolldeftestmapperStructTesttimestimes(){given:初始化数据UserDTOdtonewUserDTO(name:笑傲菌,age:20,idCard:1234,phoneNumber:18211932334,address:北京天安门,gender:1,birthday:newDate(),isMarried:false)when:调用方法传统的getter、setter拷贝longstartTimeSystem。nanoTime();UserInfoVOoldResmapperStructService。originalCopyItem(dto,times)DurationoriginalWasteTimeDuration。ofNanos(System。nanoTime()startTime);采用工具实现反射类的拷贝longstartTime1System。nanoTime();UserInfoVOutilResmapperStructService。utilCopyItem(dto,times)DurationutilWasteTimeDuration。ofNanos(System。nanoTime()startTime1);longstartTime2System。nanoTime();UserInfoVOmapStructResmapperStructService。newCopyItem(dto,times)DurationmapStructWasteTimeDuration。ofNanos(System。nanoTime()startTime2);then:校验数据println(timestimes)println(原始拷贝的消耗时间为:originalWasteTime。getNano())println(BeanUtils拷贝的消耗时间为:utilWasteTime。getNano())println(mapStruct拷贝的消耗时间为:mapStructWasteTime。getNano())println()where:比较不同次数调用的耗时timesignore1null10null100null1000null}
  测试的Service如下所示:publicclassMapperStructService{publicUserInfoVOnewCopyItem(UserDTOuserDTO,inttimes){UserInfoVOuserInfoVOnewUserInfoVO();for(inti0;itimes;i){userInfoVOInfoConverter。INSTANT。convert(userDTO);}returnuserInfoVO;}publicUserInfoVOoriginalCopyItem(UserDTOuserDTO,inttimes){UserInfoVOuserInfoVOnewUserInfoVO();for(inti0;itimes;i){userInfoVO。setUserName(userDTO。getName());userInfoVO。setAge(userDTO。getAge());userInfoVO。setBirthday(userDTO。getBirthday());userInfoVO。setIdCard(userDTO。getIdCard());userInfoVO。setGender(userDTO。getGender());userInfoVO。setIsMarried(userDTO。getIsMarried());userInfoVO。setPhoneNumber(userDTO。getPhoneNumber());userInfoVO。setAddress(userDTO。getAddress());}returnuserInfoVO;}publicUserInfoVOutilCopyItem(UserDTOuserDTO,inttimes){UserInfoVOuserInfoVOnewUserInfoVO();for(inti0;itimes;i){BeanUtils。copyProperties(userDTO,userInfoVO);}returnuserInfoVO;}}

不会醒皮,再贵的陈皮也会被浪费很多人在煮(泡)陈皮的时候,都会觉得自己泡出来的,不够在外面店里试喝的口感好。其实这是因为醒皮没做好。泡(焖)陈皮,和煮陈皮的醒皮完全不一样,因为煮皮是可以用沸水激发出陈……绿色中国鄂尔多斯能源转型记绿色带来新希望中新网鄂尔多斯4月11日电题:鄂尔多斯能源转型记:绿色带来新希望中新网记者李爱平鄂尔多斯的煤炭正在变得‘绿’起来。在鄂尔多斯,很多煤矿已实现了全自动化生产,中控室的……叠峰说乳腺癌药物一药难求,300元一盒炒到2500元楠溪江叠峰山水。源头叠峰山脉的地下喷泉,含有优质天然的水的钙。连日来乳腺癌治疗药物:水中黄金,致力环境保护。茶道专用,共筑健康生活。进口瑞宁得现在一药难求,原价约3……一味万能化痰药,煮水一杯,化解你全身上下,五脏六腑的痰!痰多,痰湿重的人注意了!这痰会随着气血跑到你全身上下,各个脏腑,它停在哪,你哪里就出问题了,所以今天我教你用万能化痰药陈皮搭配煮水喝,化解你全身的痰。为啥说这陈皮是万能化……数字疗法第一股Pear申请破产,数字医疗迎至暗时刻21世纪经济报道记者季媛媛上海报道从2007年开始,全球数字疗法开始萌芽,大量有关数字技术应用于患者疾病管理的研究文献发布(包括CBT等治疗方式的研究)、数字疗法产品陆续上市。……严重或致失明!南宁一3岁孩子从小怕光,竟是因为来源:南国早报南国早报全媒体记者郑妮孩子睫毛倒着长家长们得注意了!南宁市民韦女士的儿子今年3岁从小害怕太阳光但她不以为然直到近日……漫议如此试胆太危险来源:【交汇点新闻客户端】最近,河南某地砸了一块网红试胆石。之所以这么做,是因为石头有裂痕,可游客不顾危险依然踊跃打卡拍照。无独有偶,上海一处网红保安亭,引得游客爬上去拍……乐游嘉禾南岭山神奇的双睡美人李相勇南岭山又名晋屏山,位于湖南省郴州市嘉禾县城的西南边陲,是嘉禾的绿色明珠。山势雄伟壮丽,主峰尖峰岭海拔913。7米,是蓝山、嘉禾两县百里嵩岭上的群峰之冠。人说南岭山有……一定要看!石家庄重磅规划近日,石家庄市商务局对《石家庄市商业网点布局实施规划(20222035年)》(草案)进行公示,草案公示稿中提到的,将石家庄商业发展定位确定为:时尚、人文、智慧的华北区域消费中心……汽车降价卖不动了?这就是一场活生生的营销骗局!谁买谁上当在当今的市场经济中,营销手段已成为商家吸引消费者的一种重要手段。汽车行业也不例外,各大汽车品牌为了推销自己的产品,经常采用各种手段来吸引消费者的注意力。其中,以汽车降价卖不动为……热议欧冠抽签结果皇马正在走上赛季类似路线,再次夺冠很有可能刚刚,202223赛季欧冠14决赛抽签结果出炉:皇马vs切尔西、国米vs本菲卡、曼城vs拜仁、AC米兰vs那不勒斯。抽签结果结束之后,外国网友也发布了一系列热议:皇马连续……曝北京首钢迎回超级外援!堪称广东宏远克星,解立彬要做最后一搏曝北京首钢迎回超级外援迈克瑞北京首钢第三阶段的状态非常糟糕,5战3败,球队排名已经跌至联赛第八的位置。在北京首钢连续遭到上海男篮击败之后,球队外援阵容的短板也慢慢暴露出来……
阿里云与浙江传播大脑深化合作,将浙江融媒体经验推向全国3月28日,传播大脑科技(浙江)股份有限公司(以下简称传播大脑)在杭举行首次产品发布会。会上,传播大脑技术生态联盟成立,阿里云作为重要伙伴与传播大脑签订深化合作协议。传播……一封写给天堂堂弟的家书亲爱的堂弟:年年清明,今有清明。这是一个我不太愿意回忆起的日子,转眼间离你牺牲已是一年有余,但又是个必须提起你的日子,因为你是爸妈的骄傲,是我们全家人的自豪,是村上人的英……北美版甄嬛传再现,撕了十多年,竟然还没完结?微博之夜结束,内娱好像又平静下来了,属实有些无聊,但是最近欧美圈,却刮起了一阵腥风血雨。多位欧美明星主动站队,霉霉泰勒斯威夫特、大布夫妇、詹妮弗洛佩兹、狼姐夏奇拉、麦粒、……健康如何改善自己的睡眠质量?睡眠指导规律的作息对身体的恢复是很重要的,睡眠不足或者睡眠质量不高,会带来一系列的机体损害,如判断力下降、免疫功能低下、内分泌紊乱等。那么,我们如何来改善自己的睡眠质量?……文胖无杜勇士赢不了17年的詹欧KD不是后排乘客ampampa直播吧2月26日讯近日,名记BrianWindhorst在《DanPatrickShow》节目中谈到了杜兰特。Windhorst表示:我相信勇士若没有杜兰特不可能击败骑士……当妊娠遇上巧囊介入超声来帮忙当妊娠期遇上卵巢较大的巧克力囊肿是终止妊娠?期待治疗?还是手术干预?小红(化名)没有进行孕前检查,就意外怀孕了。孕1个多月,小红进行超声检查时,发……尘埃落定!马宁跑路悬念揭晓,名记透露最新消息,真相水落石出前国足主帅李铁被抓后,涉案人员已达20余人,其中有俱乐部人员、现役球员,以及刘奕、陈永亮、陈戌源这样的足协高层,但是让人遗憾的是,李铁案发酵3个月以来,并无裁判落网。要知……山东乳山加速推进海上风电基地建设来源:央视新闻客户端眼下,山东半岛南海上风电基地正在乳山加紧建设。以此为契机,当地大力开展招商引资活动,一大批海上风电及海工装备项目正加速落地投产。位于乳山的山东海……湖南闯出个磷酸铁锂一哥在宁德时代比亚迪背后,年入400亿2023年2月消息:湖南裕能成功登陆资本市场,目前市值达到356。14亿元(截至2月20日)。公开资料显示:这是湘潭市第6家、湖南省今年首家上市企业,是国内主要的锂离子电池正极……西丽湖越发犀利深圳河科创加速河套深港科技创新合作区文羊城晚报全媒体记者王丹阳图羊城晚报全媒体记者梁喻到广东经济第一大区,打卡地标建筑天空之城;在大湾区唯一以科技创新为主题的特色平台,感受……重庆妹子获中国麻将大赛川麻冠军,奖金20万元只会玩四川麻将,3月28日,根据重庆广电第1眼,在浙江杭州进行的首届中国麻将大赛中,重庆妹子郭女士获得四川麻将冠军,获得奖金20万元。郭女士称:我是四川麻将的冠军,我是重庆人,四川重庆都……甘肃推动原材料变新材料助力打造西部能源和化工基地中新网甘肃嘉峪关3月19日电(张婧杨娜)甘肃依托金川集团、酒钢集团、白银集团等龙头企业,以镍钴、铜、铝、铅锌、高品质碳钢、不锈钢、动力电池材料等产业链为重点,推动更多‘原材料’……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网