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

面试官问我如何理解IOC和DI

时间:2023-04-01 22:43:42 Java

IOC/DI鍏堥檮涓婃垜鑷繁鎬荤粨鐨勪緷璧栨敞鍏I瀹炵幇婧愮爜绗旇璇村埌渚濊禆娉ㄥ叆锛岄鍏堣鐞嗚ВIOC鍜孌I銆侷OC锛屽叏绉癐nversionOfControl锛屾帶鍒跺弽杞槸闈㈠悜瀵硅薄缂栫▼鐨勪竴绉嶈璁℃€濇兂锛屼富瑕佺敤浜庨檷浣庝唬鐮佷箣闂寸殑鑰﹀悎搴︺€侱I锛屽叏绉癉ependencyInjection锛屼緷璧栨敞鍏ユ槸IOC鐨勫叿浣撳疄鐜般€傛槸鎸囬€氳繃澶栭儴娉ㄥ叆瀵硅薄鐨勫疄渚嬪寲杩囩▼锛岄伩鍏嶅璞¤嚜韬唴閮ㄧ殑澶栭儴渚濊禆銆侷OC鎺у埗鍙嶈浆鐨勮璁℃ā寮忓彲浠ュぇ澶ч檷浣庣▼搴忕殑鑰﹀悎搴︺€傚湪VSCode鐨勬帶鍒跺弽杞璁℃ā寮忎腑锛岃楗板櫒鐨勪富瑕佷綔鐢ㄦ槸瀹炵幇DI渚濊禆娉ㄥ叆鐨勫姛鑳斤紝绠€鍖栦竴浜涢噸澶嶇殑鍐欐硶銆傜敱浜庤繖涓€姝ョ殑瀹炵幇姣旇緝澶嶆潅锛屾垜浠厛浠庝竴涓畝鍗曠殑渚嬪瓙寮€濮嬶紝浜嗚В涓€涓嬭楗板櫒鐨勫熀鏈師鐞嗐€侷mplementation@serviceA鍜孈serviceB鏄鐞嗗弬鏁扮殑鍙傛暟瑁呴グ鍣紝鐢眂reateDecorator鏂规硶鍒涘缓銆侤parameter瑁呴グ鍣ㄧ殑浣跨敤鏂规硶锛氭帴鏀朵笁涓弬鏁皌arget锛氬浜庨潤鎬佹垚鍛橈紝灏辨槸绫荤殑鏋勯€犲嚱鏁帮紝瀵逛簬瀹炰緥鎴愬憳锛屽氨鏄被鐨勫師鍨嬮摼key锛氭柟娉曠殑鍚嶅瓧锛屾敞鎰忔槸鍚嶅瓧鏂规硶鐨勶紝涓嶆槸鍙傛暟Nameindex锛氬弬鏁板湪鏂规硶涓綅缃殑涓嬫爣@return锛氳繑鍥炲€煎皢琚拷鐣lassC{constructor(@serviceAprivatea:A,@serviceBprivateb:B){}}鎵€鏈夊弬鏁拌楗板櫒閮芥槸閫氳繃createDecorator鏂规硶鍒涘缓鐨勶紝'A'鍜?B'鏄楗板櫒鐨勫敮涓€鏍囪瘑銆俢onstserviceA=createDecorator("A");constserviceB=createDecorator("B");瑁呴グ鍣ㄩ鍏堝垽鏂槸鍚﹁缂撳瓨锛屽鏋滆缂撳瓨锛屽垯鍙栧嚭缂撳瓨鐨勫弬鏁拌楗板櫒锛屽鏋滄病鏈夎缂撳瓨锛屽垯涓簊erviceIdentifier鍒涘缓涓€涓弬鏁拌楗板櫒銆傚嚱鏁癱reateDecorator(serviceId:string):ServiceIdentifier{if(_util.serviceIds.has(serviceId)){return_util.serviceIds.get(serviceId)asServiceIdentifier;}}serviceIdentifierparameterdecoratoronly鎴戝仛鐨勪竴浠朵簨鏄Е鍙憇toreServiceDependency瀛樺偍鎵€鏈夌殑渚濊禆锛屽瓨鍌ㄨ楗板櫒鏈韩鐨刬d锛屽弬鏁扮殑涓嬫爣绱㈠紩锛屾槸鍚﹀彲閫夈€俢onstid=functionserviceIdentifier(target:Ctor,key:string,index:number):void{storeServiceDependency(id,target,index,false);};id.toString=()=>serviceId;_util.serviceIds澶嶅埗浠g爜.set(serviceId,id);storeServiceDependency鏈川涓婃槸鍦ㄧ洰鏍嘋绫讳笂璁剧疆涓や釜闈欐€佸睘鎬?di$target鍜?di$dependencies锛屽垎鍒瓨鍌ㄧ洰鏍囷紝鍐嶅瓨鍌ㄧ洰鏍囨湰韬垽鏂槸鍚︽湁宸茬粡瀛樺湪澶緷璧栦簡銆侰.$di$鐩爣锛?/绫籆C.$di$dependencies[0].id.toString();//A鎴朆C.$di$dependencies;//[{id:serviceIdentifier,index:1,optional:false},{id:serviceIdentifier,index:0,optional:false}]闄や簡class涔嬪锛宊util.serviceIds涓篃瀛樺湪銆傝楗板櫒鍦ㄥ0鏄庣被鏃跺簲鐢紝鍥犳鍦ㄥ疄渚嬪寲浠讳綍绫讳箣鍓嶇‘瀹氫緷璧栧叧绯汇€傜紪璇憈s鍙互璇佹槑杩欎竴鐐广€傚彲浠ョ湅鍒板綋绫讳腑澹版槑浜哶_decorate鏃讹紝瑁呴グ鍣ㄥ氨浼氳鎵ц銆倂arC=/**@class*/(function(){functionC(a,b){this.a=a;this.b=b;}C=__decorate([__param(0,serviceA),__param(1銆乻erviceB)],C);杩斿洖C;})();鍏舵鏄疭erviceCollection锛岃繖閲岃楗板櫒浼氫綔涓洪敭鐨勫敮涓€鏍囪瘑锛屽疄渚嬪寲鐨勭被浣滀负鍊硷紝閮藉瓨鍌ㄥ湪svrsCollection涓€俿vrsCollection鐨勫疄鐜颁篃寰堢畝鍗曪紝鐩存帴浣跨敤Map鏂规硶鏉ュ瓨鍌ㄥ畠浠€俢onstaInstance=newA();constbInstance=newB();constsvrsCollection=newServiceCollection();svrsCollection.set(serviceA,aInstance);svrsCollection.set(serviceB,bInstance);鍙渶瑕佷娇鐢╣et鏂规硶锛屽苟浼犲叆瀵瑰簲鐨勫弬鏁拌楗板櫒锛屽氨鍙互寰楀埌瀵瑰簲鐨勫疄渚嬪寲绫汇€俿vrsCollection.get(鏈嶅姟A);//鏂扮殑A()svrsCollection.get(serviceB);//newB()InstantiationService鏄緷璧栨敞鍏ョ殑鏍稿績锛屽畠浣跨敤鍙傛暟瑁呴グ鍣紝濡俿erviceA鍜宻erviceBServiceIdentifier浣滀负keyinprivatevariableservices淇濆瓨浜嗕緷璧栨敞鍏ョ殑鎵€鏈夊疄渚嬪寲绫汇€傛湇鍔′繚瀛榮vrsCollection銆俢onstinstantiationService=newInstantiationService(svrsCollection);瀹冩毚闇蹭簡涓変釜鍏叡鏂规硶锛歝reateInstance璇ユ柟娉曟帴鍙椾竴涓被骞舵瀯閫犺绫荤殑闈炰緷璧栨敞鍏ュ弬鏁帮紝鐒跺悗鍒涘缓璇ョ被鐨勫疄渚嬨€俰nvokeFunction璇ユ柟娉曟帴鍙椾竴涓洖璋冨嚱鏁帮紝璇ュ嚱鏁板彲浠ラ€氳繃acessor鍙傛暟璁块棶璇nstantiationService涓殑鎵€鏈変緷璧栨敞鍏ラ」銆俢reateChild杩欎釜鏂规硶鎺ュ彈涓€涓緷璧栭泦鍚堬紝骞跺垱寤轰竴涓柊鐨処nstantiationService鏉ヨ鏄巚scode鐨勪緷璧栨敞鍏ユ満鍒朵篃鏄湁灞傛鐨勩€俢reateInstance鏂规硶鏄疄渚嬪寲鐨勬牳蹇冩柟娉曪細constcInstance=instantiationService.createInstance(C,"L","R")asC;棣栧厛鏄幏鍙朿torOrDescriptor锛屽畠鏄疌绫伙紝浠ュ強闈炰緷璧栨敞鍏ラ渶瑕佷紶鍏ョ殑鍙傛暟rest銆俢onstresult=this.createCtorInstance(ctorOrDescriptor,rest);鐒跺悗浣跨敤getServiceDependencies鑾峰彇骞舵帓搴忔寕杞紺绫婚潤鎬佸睘鎬х殑$di$dependencies锛屽洜涓轰繚瀛樼殑鏃跺€欓『搴忔槸鍙嶇殑銆俢onstserviceDependencies=_util.getServiceDependencies(ctor).sort((a,b)=>a.index-b.index);鎻愬彇鐨勪緷璧杝erviceDependencies涓昏鏄亶鍘嗚幏鍙栭噷闈㈢殑鍙傛暟瑁呴グ鍣╯erviceA鍜宻erviceB銆俢onstserviceArgs:any[]=[];for(constdependencyofserviceDependencies){constserviceInstance=this.getOrCreateServiceInstance(dependency.id);serviceArgs.push(serviceInstance);}getOrCreateServiceInstance鐨勬湰璐ㄦ槸浠庢湇鍔′腑鑾峰彇瀹炰緥鍖栵紝鍗硈vrsCollection绫诲瀷銆俢onstinstanceOrDesc=this.services.get(id);//鐩稿綋浜巌d锛屽嵆鍙傛暟瑁呴グ鍣?/svrsCollection.get(id);鎶婅繖浜涘疄渚嬪寲鐨勭被鍏ㄩ儴鍙栧嚭鏉ユ斁鍒皊erviceArgs涓悗锛岀敱浜庡弬鏁拌楗板櫒鏄湪瀹炰緥鍖栫被鐨勬椂鍊欐墽琛岀殑锛屽苟涓旀敹闆嗕簡渚濊禆锛屾墍浠erviceArgs灏辨槸ctor瀵瑰簲鐨勪緷璧栧弬鏁帮紝涔熷氨鏄被C锛岄渶瑕佹敞鍏ャ€傜粍鍚堥潪渚濊禆鍙傛暟鍙互甯姪鎴戜滑鎴愬姛瀹炰緥鍖栨垜浠殑ctor绫汇€傛柊鏋勯€犲櫒锛?..[...serviceArgs锛?..args]锛夛紱浜ゆ祦濡傛灉鏂囩珷鍜岀瑪璁拌兘缁欐偍甯︽潵涓€鐐瑰府鍔╂垨鍚彂锛岃涓嶈鍚濆暚鎮ㄧ殑鐐硅禐鍜屾敹钘忋€傛敹褰曞湪https://github.com/Wscats/art...娆㈣繋澶у鍏虫敞鍜屼氦娴侊紝浣犱滑鐨勮偗瀹氭槸鎴戝墠杩涙渶澶х殑鍔ㄥ姏馃榿

最新推荐
猜你喜欢