当前位置: 首页 > 后端技术 > Java

SpringPlugin-Core在业务中的应用

时间:2023-04-01 18:33:47 Java

鍓嶈█涓€鐩磋礋璐i儴闂ㄧ殑璁㈠崟妯″潡锛屼粠php杞琂ava涔熸槸濡傛銆傛垜鎹簡涓€绉嶈瑷€鏉ュ疄鐜拌鍗曠浉鍏崇殑鍔熻兘銆傜劧鍚嶴pring涓湁寰堝璁捐妯″紡宸茬粡鏋勫缓浜嗗熀纭€妯″潡锛屽府鍔╂垜浠湪瀹為檯涓氬姟涓繘琛岄€昏緫瑙h€︼紝浣跨敤璧锋潵闈炲父鏂逛究锛佸氨鍍忔垜浠殑璁㈠崟鎿嶄綔妯″潡涓€鏍枫€傝鍗曠敓鎴愬悗锛屾湁寰堝鎿嶄綔銆備緥濡傦細鍙栨秷銆佷粯娆俱€佸叧闂?..绛夈€傞偅涔堢敤璁捐妯″紡鐨勬€濇兂鏉ュ鐞嗚繖浜涗笉鍚岀殑鎿嶄綔锛屾渶濂界殑鍔炴硶灏辨槸鐢ㄧ瓥鐣ユā寮忔潵瑙e喅锛佸皢涓嶅悓鐨勬搷浣滃垎閰嶇粰涓嶅悓鐨勫疄鐜扮被銆傝繖涓嶏紝鎴戝彂鐜颁簡涓€涓ソ涓滆タSpring鎻掍欢锛丼pringPluginSpringplugin鍦ㄧ湅涓€浜涘紑婧愰」鐩殑鏃跺€欎篃鐪嬪埌浜嗚繖涓皬涓滆タ锛屾劅瑙夎繕涓嶉敊銆傛垜绔嬪嵆浣跨敤瀹冨苟灏嗗叾甯﹀埌鎴戜滑鐨勪笟鍔″満鏅腑銆備笉锛岃繕鏄甫澶у鍘讳綋楠屼竴涓嬪惂銆傛帴涓嬫潵浣跨敤Spring鎻掍欢閲嶆瀯涓嬪崟鐩稿叧鎿嶄綔鐨勫疄鐜般€傝繖閲屾垜浠彧妯℃嫙銆佹敮浠樺拰鍏抽棴鎿嶄綔銆傛渶鍚庣畝鍗曞垎鏋愪竴涓婼pring鎻掍欢鍦ㄥ疄璺典腑鐨勫師鐞嗐€傞鍏堝畾涔変竴涓搷浣滅被鍨嬬殑鏋氫妇绫绘潵瀹氫箟鎴戜滑绯荤粺鐩墠鏀寔鐨勬搷浣滅被鍨嬶紒publicenumOrderOperatorType{/***Close*/CLOSED,/***Payment*/PAY;}绗簩姝ュ畾涔夋搷浣滄帴鍙o紝瀹炵幇Spring鎻掍欢鐨凱lugin鎺ュ彛锛岄厤缃彃浠秈npublicinterfaceOrderOperatorPluginextendsPlugin{/***瀹氫箟鎿嶄綔鍔ㄤ綔*@paramoperator*@return*/publicOptionalapply(OrderOperatorDTOoperator);}//閰嶇疆鎻掍欢锛屾彃浠秈n鍐欏ソ浜嗭紝鎴戜滑瑕佽鎻掍欢鐢熸晥锛丂Configuration@EnablePluginRegistries({OrderOperatorPlugin.class})publicclassOrderPluginConfig{}绗笁姝ュ畾涔夊叿浣撶殑瀹炵幇绫伙紙鏀粯鎿嶄綔锛屽叧闂搷浣滐級@ComponentpublicclassPayOperatorimplementsOrderOperatorPlugin{@OverridepublicOptionalapply(OrderOperatorDTOoperator){//鏀粯鎿嶄綔//doPay()returnOptional.of("鏀粯鎴愬姛");}@Overridepublicbooleansupports(OrderOperatorDTOoperatorDTO){returnoperatorDTO.getOperatorType()==OrderOperatorType.PAY;}}@Componentpublic绫籆losedOperatorimplementsOrderOperatorPlugin{@OverridepublicOptionalapply(OrderOperatorDTOoperator){//鍏抽棴鎿嶄綔//doClosed()returnOptional.of("鍏抽棴璁㈠崟鎴愬姛");}@Overridepublicbooleansupports(OrderOperatorDTOoperatorDTO){returnoperatorDTO.getOperatorType()==OrderOperatorType.CLOSED;}}杩欓噷闇€瑕佹敞鎰忕殑鏄疄鐜颁簡supports鏂规硶銆傛鏂规硶杩斿洖涓€涓竷灏斿€硷紝鐩磋涓婄湅璧锋潵鍍忎竴涓€夋嫨鍣ㄦ潯浠躲€傝繖閲岋紝鍙互鐩存帴璁や负锛屽綋Support杩斿洖True鏃讹紝灏辨壘鍒颁簡褰撳墠鎿嶄綔鐨勫疄鐜扮被锛佸畾涔変簡涓や釜涓嶅悓鐨勫疄鐜扮被锛岄偅涔堟垜浠浣曟壘鍒板叿浣撶殑瀹炵幇绫诲憿锛熸渶鍚庡畾涔変笟鍔℃帴鍙o紝浠ュ強涓氬姟瀹炵幇绫籶ublicinterfaceOrderService{/***鎿嶄綔璁㈠崟鎺ュ彛*@paramoperator*@return*/OptionaloperationOrder(OrderOperatorDTOoperator);}@ServicepublicclassOrderServiceImplimplementsOrderService{@ResourcePluginRegistryorderOperatorPluginRegistry;@OverridepublicOptionaloperationOrder(OrderOperatorDTOoperator){OrderOperatorPluginpluginFor=orderOperatorPluginRegistry.getPluginFor锛堟搷浣滃憳锛夛紱杩斿洖pluginFor.apply(operator);}}鍦ㄤ笟鍔℃帴鍙e疄鐜扮被涓紝鎴戜滑娉ㄥ叆浜咢ResourcePluginRegistryorderOperatorPluginRegistry;鍚嶅瓧蹇呴』鏄帴鍙e悕+Registry锛屾垜杩欓噷鏄痮rderOperatorPluginRegistry锛屾垜浠洖鍘诲垎鏋愭簮鐮佺殑鏃跺€欙紝鐪嬬幇鍦ㄧ殑鍐欐硶灏卞浜嗐€傛帴涓嬫潵鎴戜滑娴嬭瘯@RunWith(SpringRunner.class)@SpringBootTestpublicclassOrderOperatorPluginTest{@ResourceOrderServiceorderService;@ResourceApplicationContext搴旂敤绋嬪簭涓婁笅鏂囷紱@Testpublicvoidtest_operation_closed(){finalOrderOperatorDTOoperator=newOrderOperatorDTO();operator.setOperatorType(鍏抽棴);OptionaloptionalO=orderService.operationOrder(operator);Assertions.assertEquals("璁㈠崟鍏抽棴鎴愬姛",optionalO.get());}@Testpublicvoidtest_operation_pay(){finalOrderOperatorDTOoperator=newOrderOperatorDTO();operator.setOperatorType(OrderOperatorType.PAY);OptionaloptionalO=orderService.operationOrder(operator);Assertions.assertEquals("鏀粯鎴愬姛",optionalO.get());}}杩欎釜杩愯缁撴灉娌℃湁闂锛屽ぇ瀹跺彲浠ヨ嚜宸变笅杞戒唬鐮佽繍琛屼竴涓媬~馃お馃お鎰熻濡傛灉鎴戞妸鏁翠釜璁㈠崟娴佺▼寮€鍙戞垚涓嶅悓鐨勬彃浠?..鍒涘缓璁㈠崟鏄竴涓祦绋?鍦ㄨ繖涓繃绋嬬殑杩囩▼涓紝鎴戜滑鍦ㄤ笉鍚岀殑浣嶇疆鎻掑叆涓嶅悓鐨勬彃浠躲€傛瘮濡備笅鍥撅紒鏈€鍚庯紝浠呬粎鎶婃墍鏈夌殑鎻掍欢缁勭粐璧锋潵锛屾垜浠槸涓嶆槸灏卞彲浠ユ悶瀹氫竴涓畬鏁寸殑璁㈠崟娴佺▼锛岃€屾垜浠墍鍋氱殑鍙槸闈㈠鎻掍欢鐨勫紑鍙戯紝涓撴敞浜庢煇涓彃浠跺憿锛熶篃璁镐笅娆¢噸鏋勮鍗曠殑鏃跺€欙紝鎴戝彲浠ヨ繖鏍疯瘯璇曪紒閲嶇偣婧愮爜鍒嗘瀽鍏堢湅娉ㄥ唽鎻掍欢鐨勬敞瑙o紵extendsPlugin>[]value();}value灞炴€ф槸涓€涓暟缁勶紝蹇呴』瀹炵幇Plugin鎺ュ彛銆傝繖鏄畾涔夋彃浠剁殑鍩烘湰鏉′欢~銆傚啀鐪婭mport娉ㄩ噴锛孭luginRegistriesBeanDefinitionRegistrar瀹炵幇浜咺mportBeanDefinitionRegistrar鎺ュ彛锛屾湁鐐瑰皬鎰忔€濓紝publicclassPluginRegistriesBeanDefinitionRegistrarimplementsImportBeanDefinitionRegistrar{}涔嬪墠鏈変竴绡囨枃绔犲垎鏋愮浉鍏冲姞杞界被鍒板鍣紝璇风湅涓嬩竴绡囦粙缁嶃€侷mportBeanDefinitionRegistrar鐨勪綔鐢ㄧ洿鎺ヤ緷璧栦簬鏍稿績浠g爜publicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry){//鐩墠鎴戝彧娉ㄥ唽浜嗕竴涓彃浠禣rderOperatorPluginClass[]types=(Class[])((Class[])importingClassMetadata.getAnnotationAttributes(EnablePluginRegistries.class.getName()).get("鍊?));绫籟]var4=绫诲瀷锛沬ntvar5=types.length;//闀垮害涓?for(intvar6=0;var6type=var4[var6];//椤惧悕鎬濅箟灏辨槸FactoryBean銆侾luginRegistryFactoryBean#getObject鐨勬柟娉曟渶缁堣繑鍥濷rderAwarePluginRegistry銆傚悕绉版敮鎸佹帓搴忋€侭eanDefinitionBuilder鏋勫缓鍣?BeanDefinitionBuilder.rootBeanDefinition(PluginRegistryFactoryBean.class);builder.addPropertyValue("绫诲瀷",绫诲瀷);AbstractBeanDefinitionbeanDefinition=builder.getBeanDefinition();Qualifierannotation=(Qualifier)type.getAnnotation(Qualifier.classation);if(annot!=null){AutowireCandidateQualifierqualifierMetadata=newAutowireCandidateQualifier(Qualifier.class);qualifierMetadata.setAttribute(AutowireCandidateQualifier.VALUE_KEY,annotation.value());beanDefinition.addQualifier锛坬ualifierMetadata锛夛紱}//鎻掍欢涓病鏈夋坊鍔燪ualifier濡傛灉涓簄ull锛屽垯娣诲姞Registry锛佽繖灏辨槸涓轰粈涔圥luginRegistry鍦ㄦ敞鍏ョ殑鏃跺€欐槸鐢≒luginName+Registry鍜孭luginRegistryFactoryBean鏉ュ疄鐜扮殑銆傚瓧绗︿覆beanName=娉ㄩ噴==null锛烻tringUtils.uncapitalize(type.getSimpleName()+"Registry"):annotation.value();registry.registerBeanDefinition(beanName,builder.getBeanDefinition());鐒跺悗娉ㄥ叆瀹瑰櫒鍚庯紝璋冪敤getPluginFor鎵惧埌褰撳墠绛栫暐鐨勫疄鐜扮被銆?/OrderAwarePluginRegistry绫籶ublicTgetPluginFor(Sdelimiter){Iteratorvar2=super.getPlugins().iterator();鎻掍欢鎻掍欢锛涘仛{濡傛灉(!var2.hasNext()){杩斿洖null;}plugin=(Plugin)var2.next();//杩欓噷鍒ゆ柇supports鐨勬柟娉曡繑鍥瀟rue鏃讹紝浼氳烦鍑篖oop}while(plugin==null||!plugin.supports(delimiter));returnplugin;}//鍙﹀锛宻uper.getPlugins涓細璋冪敤initializa鏂规硶锛屽嵆鎻掍欢鏀寔鎺掑簭鍔熻兘锛屽彧瑕佸湪鎻掍欢涓坊鍔燨rder()娉ㄨВ鍗冲彲銆俻rotectedListinitialize(Listplugins){Listresult=super.initialize(plugins);}Collections.sort(result,this.comparator);杩斿洖缁撴灉;}GitHub涓殑浠g爜