浣滆€咃細灏忓倕鍗氬锛歨ttps://bugstack.cn鍘熸枃锛歨ttps://mp.weixin.qq.com/s/Xq7oQg7dYESMYxHVnxX8Dw娌夋穩锛屽垎浜紝鎴愰暱锛岃鑷繁鍜屼粬浜洪兘鏈夋墍鏀惰幏锛侌煒?.涓轰粈涔堝墠瑷€锛屼綘鐨勪唬鐮佸彧鏄兘鐢紵娌℃湁鎶€鏈繁搴︼紝娌℃湁鐭ヨ瘑鍌ㄥ锛屾病鏈夌粡楠岀Н绱紝鎬庝箞鍐欎唬鐮侊紵鐧惧害涓€涓嬶紝閬囧埌闂绋嶅井鎼滀竴涓嬶紝鐒跺悗鏌ヤ竴娈碉紝涓嶇瀹冪殑鍘熺悊鏄粈涔堬紝閫傚悎浠€涔堟牱鐨勫満鏅紝鍏堣创鍒拌嚜宸辩殑椤圭洰閲岋紝鐪嬶紝鑳借繍琛岋紝灏卞彲浠ヤ簡鑳借窇銆傞偅涔堣繖鏍风殑浠g爜鍙槸涓€涓彲鐢ㄧ殑浜や粯锛屾牴鏈病鏈変竴瀹氱殑璐ㄩ噺淇濊瘉锛屾洿璋堜笉涓婃暟鎹粨鏋勩€佺畻娉曢€昏緫鍜岃璁℃ā寮忥紝閭d箞鐪嬬紪绋嬭祫鏂欑殑LeetCode灏卞叏娌′簡銆傚綋浣犺寰楄嚜宸辩湅浜嗗緢澶氳祫鏂欎笉鐭ラ亾鎬庝箞鐢ㄧ殑鏃跺€欙紝浣犱細璇翠粈涔堬紝鐪熸鐨勫嵎锛屼綘宸茬粡瀛︿細浜嗐€備絾鍏跺疄锛屾垜骞朵笉璁や负娣辨寲鎶€鏈紝姊崇悊鍑轰竴濂楀畬鏁寸殑鐭ヨ瘑浣撶郴锛屾敹鑾蜂竴鐐圭偣鍔姏锛屽氨鏄湪閲忋€傜浉鍙嶏紝瑙傜湅鎶€鏈棰戝氨鍍忕湅鐢靛奖涓€鏍风畝鍗曘€傚鏋滀綘涓嶅啓妗堜緥锛屼綘浼氳涓鸿繖鏈功寰堝ソ璇汇€傝剳鍔涙€濊€冪殑鏃犳剰涔夌己澶卞拰鏈烘鐨勭墿鐞嗛噸澶嶆槸浣撶Н锛岀敋鑷虫槸浣撶Н銆傚氨濂芥瘮璁╀綘鐢ㄤ竴涓睘鎬ф嫹璐濆伐鍏锋妸vo杞琩to锛屼綘鐢ㄥ摢涓紝Apache鐨勮繕鏄疭pring鐨勶紝杩樻槸鍒殑锛屽摢涓晥鐜囨渶楂橈紵鎺ヤ笅鏉ユ垜浠敤鏁版嵁鏉ラ獙璇佷竴涓嬶紝骞舵彁渚涘悇绉嶆渚嬬殑浣跨敤瀵规瘮銆?銆佹€ц兘娴嬭瘯瀵规瘮鍦↗ava绯荤粺宸ョ▼寮€鍙戣繃绋嬩腑锛屼細瀛樺湪鍚勫眰涔嬮棿鐨勫璞¤浆鎹紝濡俈O銆丏TO銆丳O銆乂O绛夛紝濡傛灉閮芥槸鎵嬪姩get鍜宻et锛屽氨澶氮璐规椂闂翠簡-鑰楁椂涓斿彲鑳芥搷浣滈敊璇紝鎵€浠ラ€夋嫨鑷姩鍖栧伐鍏蜂細鏇存柟渚裤€傜洰鍓嶆垜鏁寸悊浜?2绉嶅璞″睘鎬ц浆鎹㈢被鍨嬶紝鍖呮嫭锛氭櫘閫歡etset銆乯son2Json銆丄pache灞炴€ф嫹璐濄€丼pring灞炴€ф嫹璐濄€乥ean-mapping銆乥ean-mapping-asm銆丅eanCopier銆丱rika銆丏ozer銆丮odelMapper銆丣Mapper銆丮apStruct鎺ヤ笅鏉ユ垜浠垎鍒祴璇曚簡杩?1绉嶅睘鎬ц浆鎹㈡搷浣滃湪100銆?000銆?0000銆?00000銆?00涓囨鏃剁殑鎬ц兘鍜屾椂闂存瘮杈冦€侭eanUtils.copyProperties鏄ぇ瀹朵唬鐮佷腑鏈€甯哥敤鐨勫伐鍏风被锛屼絾鏄彧瑕佷笉鏄湪Apache鍖呬笅璇敤锛岃€屾槸浣跨敤Spring鎻愪緵鐨勶紝瀵规€ц兘鍩烘湰涓嶄細鏈夊お澶у奖鍝嶃€備絾鏄鏋滄€ц兘鏇村ソ鐨勮瘽锛屽彲浠ユ浛浠f墜鍔╣et鍜宻et锛屾垨鑰匨apStruct鏇村ソ鐢紝鍥犱负瀹冩湰韬湪缂栬瘧鏃剁敓鎴恎et鍜宻et浠g爜锛屽氨鍍忔垜浠啓get鍜宻et涓€鏍枫€傚叾浠栦竴浜涚粍浠跺寘涓昏鏄熀浜嶢OP銆丄SM銆丆Glib瀹炵幇鐨勶紝鎵€浠ヤ細鏈夌浉搴旂殑鎬ц兘鎹熻€椼€?銆?2涓浆鎹㈡渚嬫簮鐮侊細https://github.com/fuzhengwei/guide-vo2dto璇存槑锛氬湪妗堜緥宸ョ▼涓嬪垱寤篿nterfaces.assembler鍖咃紝瀹氫箟IAssembler#sourceToTarget(SOURCEvar)鎺ュ彛锛屽苟鎻愪緵浜嗕笉鍚屾柟娉曠殑瀵硅薄杞崲鎿嶄綔绫诲疄鐜帮紝瀛︿範杩囩▼涓彲浠ョ洿鎺ヤ笅杞借繍琛岃皟璇曘€?.get\set@ComponentpublicclassGetSetAssemblerimplementsIAssembler{@OverridepublicUserDTOsourceToTarget(UserVOvar){UserDTOuserDTO=newUserDTO();userDTO.setUserId(var.getUserId());userDTO.setUserNickName(var.getUserNickName());userDTO.setCreateTime(var.getCreateTime());杩斿洖鐢ㄦ埛DTO锛泒}鎺ㄨ崘搴︼細鈽呪槄鈽呪槅鈽嗘€ц兘锛氣槄鈽呪槄鈽呪槄鎵嬫硶锛氭墜鍐欑偣璇勶細鍏跺疄杩欎釜鏂规硶涔熸槸鏃ュ父鐢ㄧ殑鏈€閲嶈鐨勬槸锛屾€ц兘鑲畾涓嶉敊锛屽氨鏄搷浣滆捣鏉ユ湁鐐归夯鐑︺€傚挨鍏舵槸澶ч噺甯︽湁灞炴€х殑VO瀵硅薄杞负DTO瀵硅薄鏃躲€備絾鍏跺疄涔熸湁涓€浜涘揩鎹风殑鎿嶄綔鏂规硶銆備緥濡傦紝鎮ㄥ彲浠ラ€氳繃Shift+Alt閫夋嫨鎵€鏈夊睘鎬э紝鐒跺悗閫氳繃Shift+Tab灏嗗畠浠悎骞朵负涓€鍒椼€傜劧鍚庣敤Alt閫変腑杩欎竴鍒楋紝绮樿创userDTO銆傛渶鍚庡垏鎹㈠埌鏈€鍚庡姞涓婃嫭鍙峰拰鍒嗗彿锛屾渶鍚庢牸寮忓寲涓€涓嬪氨澶у姛鍛婃垚浜嗐€?.json2Json@ComponentpublicclassJson2JsonAssemblerimplementsIAssembler{@OverridepublicUserDTOsourceToTarget(UserVOvar){StringstrJson=JSON.toJSONString(var);杩斿洖JSON.parseObject(strJson,UserDTO.class);}}鎺ㄨ崘锛氣槅鈽嗏槅鈽嗏槅鎬ц兘锛氣槄鈽嗏槅鈽嗏槅鎵嬫锛氬皢瀵硅薄杞负JSON瀛楃涓诧紝鍐嶅皢JSON杞负鍙︿竴涓璞°€?.ApachecopyProperties@ComponentpublicclassApacheCopyPropertiesAssemblerimplementsIAssembler{@OverridepublicUserDTOsourceToTarget(UserVOvar){UserDTOuserDTO=newUserDTO();}灏濊瘯{BeanUtils.copyProperties(userDTO,ExllegalAccess);}cInvocationTargetExceptione){e.printStackTrace();}杩斿洖userDTO锛泒}鎺ㄨ崘锛氣槅鈽嗏槅鈽嗏槅鎬ц兘锛氣槄鈽嗏槅鈽嗏槅鏂规硶锛欼ntrospector鏈哄埗鑾峰彇绫荤殑灞炴€ц繘琛岃祴鍊兼搷浣滆瘎璁猴細闄烽槺锛屽吋瀹规€т氦鍙夛紝涓嶆帹鑽?.SpringcopyProperties@ComponentpublicclassSpringCopyPropertiesAssemblerimplementsIAssembler{@OverridepublicUserDTOsourceToTarget(UserVOvar){UserDTOuserDTO=newUserDTO();BeanUtils.copyProperties(var,userDTO);杩斿洖鐢ㄦ埛DTO锛泒}鎺ㄨ崘搴︼細鈽呪槄鈽呪槅鈽嗘€ц兘锛氣槄鈽呪槄鈽呪槅鍚箟锛欼ntrospector鏈哄埗鑾峰彇Class灞炴€ц繘琛岃祴鍊兼搷浣滅偣璇勶細鍚屾牱鏄弽灏勫睘鎬ф嫹璐濓紝Spring鎻愪緵鐨刢opyProperties姣擜pache濂界敤澶氫簡锛屽彧瑕佷笉鍑洪敊锛屽熀鏈笉浼氭湁闂5.BeanMapping@ComponentpublicclassBeanMappingAssemblerimplementsIAssembler{@OverridepublicUserDTOsourceToTarget(UserVOvar){UserDTOuserDTO=newUserDTO();BeanUtil.copyProperties(var,userDTO);杩斿洖鐢ㄦ埛DTO锛泒}鎺ㄨ崘锛氣槄鈽呪槅鈽嗏槅鎬ц兘锛氣槄鈽呪槄鈽嗏槅鏂瑰紡锛氬睘鎬у鍒惰瘎璇細鎬ц兘涓€鑸?.BeanMappingASM@ComponentpublicclassBeanMappingAssemblerimplementsIAssembler{@OverridepublicUserDTOsourceToTarget(UserVOvar){UserDTOuserDTO=newUserDTO();BeanUtil.copyProperties(var,userDTO);杩斿洖鐢ㄦ埛DTO锛泒}鎺ㄨ崘搴︼細鈽呪槄鈽呪槅鈽嗘€ц兘锛氣槄鈽呪槄鈽呪槅娴嬭瘎锛氬熀浜嶢SM瀛楄妭鐮佹鏋剁偣璇勶細涓庢櫘閫欱eanMapping鐩告瘮锛屾€ц兘鏈夋墍鎻愬崌锛屽彲浠ヤ娇鐢ㄣ€?.BeanCopier@ComponentpublicclassBeanCopierAssemblerimplementsIAssembler{@OverridepublicUserDTOsourceToTarget(UserVOvar){UserDTOuserDTO=newUserDTO();BeanCopierbeanCopier=BeanCopier.create(var.getClass(),userDTO.getClass(),false);beanCopier.copy(var,userDTO,null);杩斿洖鐢ㄦ埛DTO锛泒}鎺ㄨ崘搴︼細鈽呪槄鈽呪槅鈽嗘€ц兘锛氣槄鈽呪槄鈽呪槄鏂规硶锛氬熀浜嶤Glib瀛楄妭鐮佹搷浣滅敓鎴恎et鍜宻et鏂规硶鐐硅瘎锛氭暣浣撴€ц兘寰堝ソ锛屼娇鐢ㄤ篃涓嶅鏉傘€傚彲浠ヤ娇鐢?.Orika@ComponentpublicclassOrikaAssemblerimplementsIAssembler{/***鏋勯€犱竴涓狹apperFactory*/privatestaticMapperFactorymapperFactory=newDefaultMapperFactory.Builder().build();static{mapperFactory.classMap(UserDTO.class,UserVO.class).field("userId","userId")//鍙互鎸囧畾.byDefault().register();}@OverridepublicUserDTOsourceToTarget(UserVOvar){returnmapperFactory.getMapperFacade().map(var,UserDTO.class);}}瀹樼綉锛歨ttps://orika-mapper.github.io/orika-docs/鎺ㄨ崘锛氣槄鈽呪槅鈽嗏槅鎬ц兘锛氣槄鈽呪槄鈽嗏槅鎺柦锛氭牴鎹瓧鑺傜爜鐢熸垚鏄犲皠瀵硅薄璇勮锛氭祴璇曟€ц兘涓嶅お绐佸嚭浜嗐€傚鏋滀娇鐢ㄥ畠锛岄渶瑕佷紭鍖栧皢MapperFactory鏋勯€犳垚Bean瀵硅薄銆?.Dozer@ComponentpublicclassDozerAssemblerimplementsIAssembler{privatestaticDozerBeanMappermapper=newDozerBeanMapper();}var){returnmapper.map(var,UserDTO.class);}}瀹樼綉锛歨ttp://dozer.sourceforge.net/documentation/gettingstarted.html鎺ㄨ崘搴︼細鈽呪槅鈽嗏槅鈽嗘€ц兘锛氣槄鈽呪槅鈽嗏槅鎰忔€濓細灞炴€ф槧灏勬鏋讹紝閫掑綊澶嶅埗瀵硅薄鐐硅瘎锛氭€ц兘鏈夌偣宸紝涓嶆帹鑽愪娇鐢?0.ModelMapper@ComponentpublicclassModelMapperAssemblerimplementsIAssembler{privatestaticModelMappermodelMapper=newModelMapper();static{modelMapper.addMappings(newPropertyMap(){@Overrideprotectedvoidconfigure(){//濡傛灉灞炴€у€间笉鍚岋紝鍙互鎿嶄綔map().setUserId(source.getUserId());}});}@OverridepublicUserDTOsourceToTarget(UserVOvar){returnmodelMapper.map(var,UserDTO.class);}}瀹樼綉锛歨ttp://modelmapper.org鎺ㄨ崘搴︼細鈽呪槄鈽呪槅鈽嗘€ц兘锛氣槄鈽呪槄鈽嗏槅鍚箟锛氬熀浜庡ASM瀛楄妭鐮佸疄鐜扮殑璇勮锛氳浆鎹㈠璞℃暟閲忓皯鏃舵€ц兘杈冨ソ锛屼絾11.JMapperJMapperjMapper=newJMapper<>(UserDTO.class,UserVO.class,newJMapperAPI().add(JMapperAPI.mappedClass(UserDTO.class).add(JMapperAPI.attribute("userId").value("userId")).add(JMapperAPI.attribute("userNickName").value("userNickName")).add(JMapperAPI.attribute("createTime").value("createTime"))));瀹樼綉锛歨ttps://github.com/jmapper-framework/jmapper-core/wiki鎺ㄨ崘搴︼細鈽呪槄鈽呪槄鈽嗘€ц兘锛氣槄鈽呪槄鈽呪槄鎰忔€濓細浼橀泤銆侀珮鎬ц兘銆佸仴澹竴浣撳寲鐨刯avabeanmapper璇勮锛氶€熷害纭疄涓嶉敊锛屼絾鏄劅瑙夊拰SpringBoot缁撳悎璧锋潵鏈夌偣楹荤儲锛屽彲鑳藉Э鍔夸笉瀵?2.MapStruct@Mapper(componentModel="spring",unmappedTargetPolicy=ReportingPolicy.IGNORE,unmappedSourcePolicy=ReportingPolicy.IGNORE)publicinterfaceUserDTOMappingextendsIMapping{/**鐢ㄤ簬娴嬭瘯鐨勫崟渚?/IMappingINSTANCE=Mappers.getMapper(UserDTOMapping.class);@Mapping(target="userId",source="userId")@Mapping(target="createTime",dateFormat="yyyy-MM-ddHH:mm:ss")@OverrideUserDTOsourceToTarget(UserVOvar1);@Mapping(target="userId",source="userId")@Mapping(target="createTime",dateFormat="yyyy-MM-ddHH:mm:ss")@OverrideUserVOtargetToSource(UserDTOvar1);}瀹樻柟缃戝潃锛歨ttps://github銆俢om/mapstruct/mapstruct鎺ㄨ崘锛氣槄鈽呪槄鈽呪槄鎬ц兘锛氣槄鈽呪槄鈽呪槄鎰忔€濓細缂栬瘧鏃剁洿鎺ョ敓鎴愬搴旂殑get鍜宻et锛屽儚鎵嬪啓浠g爜涓€鏍风粨鍚堟鏋讹紝浣跨敤鏂逛究銆?.鎬荤粨鍏跺疄瀵硅薄灞炴€ц浆鎹㈢殑鎿嶄綔鏃犻潪灏辨槸缂栬瘧鏈熷拰杩愯鏈熷熀浜庡弽灏勩€丄OP銆丆Glib銆丄SM銆丣avassist鐨勫鐞嗐€傚彟涓€涓ソ涓绘剰鏄湪缂栬瘧涔嬪墠鐢熸垚鐩稿簲鐨刧et銆?set,濂藉儚鏄墜鍐欑殑锛屾墍浠ユ帹鑽愭垜鏈€鍠滄鐨凪apStruct锛岀敤璧锋潵姣旇緝鑸掓湇锛屼竴涓槸浠庡姛鑳界殑鎵╁睍鎬э紝鏄撶敤鎬у拰鍏煎鎬т笂鏉ヨ銆備笉绠℃槸鍝鐢ㄩ€旓紝涓€瀹氳鍋氬ソ瀹屾暣鐨勬祴璇曞拰楠岃瘉锛屼笉瑕佷竴涓婃潵灏卞鍒剁矘璐达紝鍚﹀垯鍙兘鏃╂寲鍧戜簡锛屽綋鐒朵篃涓嶄竴瀹氭槸浼氬~鍧戠殑鍏勫紵銆?.绯诲垪鎺ㄨ崘DDD+RPC寮€鍙戝垎甯冨紡鏋舵瀯锛屾娊濂栫郴缁烻pringBoot涓棿浠惰璁″紑鍙戝崐骞存嫑鑱樼瓫閫?00+绠€鍘嗭紝鍛婅瘔浣犳€庝箞鍐欏鏄撹鎾╋紒鏁板绂荤▼搴忓憳鏈夊杩戯紵13骞存瘯涓氾紝鐢ㄤ簡涓ゅ勾鏃堕棿浠庡鍖呰繘鍏ヤ簰鑱旂綉