锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鈥曗曟瀯閫犲瓙娉ㄥ叆錛?/SPAN>Constructor Injection錛?/SPAN>妯″紡鐨勫垎鏋愪笌瀹炵幇
钄?/SPAN> 瓚?/SPAN>
錛?/SPAN>chaocai2001@yahoo.com.cn錛?/SPAN>
鎽樿錛氭湰鏂囧IoC妯″紡銆佷緷璧栨敞鍏?/SPAN>(Dependency Injection) 妯″紡鍋氫簡綆瑕佷粙緇嶏紝鏂囦腑鍒嗘瀽鏋勯犲瓙娉ㄥ叆妯″紡涓庡叾浠栨ā寮忕浉姣旇緝鐨勪紭鍔垮拰鐗圭偣錛屽茍緇欏嚭浜嗗湪JAVA涓疄鐜拌妯″紡鐨勬柟娉曘?/SPAN>
IoC錛?/SPAN>Inversion of Control錛夋ā寮忎互琚洰鍓嶇殑杞婚噺綰у鍣ㄦ墍騫挎硾搴旂敤錛岄氳繃IoC妯″紡榪欎簺瀹瑰櫒甯姪寮鍙戣呭皢鏉ヨ嚜涓嶅悓欏圭洰鐨勭粍浠惰閰嶆垚涓涓唴鑱氱殑搴旂敤紼嬪簭銆傝交閲忕駭鐨?/SPAN>IoC瀹瑰櫒錛堝Spring銆?/SPAN>pico-container錛夎櫧鐒朵負鎴戜滑鐨勫紑鍙戞彁渚涗簡寰堝ぇ鐨勪究鍒╋紝浣嗘槸鍦ㄥ緢澶氭儏鍐典笅榪欎簺杞婚噺綰у鍣ㄦ墍鎻愪緵鐨勫姛鑳藉茍涓嶄竴瀹氶潪甯擱傚悎鎴戜滑鐨勯渶瑕侊紝涔熻榪欎簺瀹瑰櫒鐨勫姛鑳借繃浜庡簽澶т簡錛屾垨鑰呮墍鎻愪緵鐨勫姛鑳界己涔忓鐗瑰畾搴旂敤鐨勯拡瀵規э紝鎴栬呮垜浠渶瑕佹洿楂樼殑榪愯鏁堢巼錛岃繖鏃舵垜浠彲浠ュ湪浜嗚ВIoC鐨勫師鐞嗙殑鍩虹涓婂埄鐢?/SPAN>JAVA鐨勫弽灝勬満鍒惰嚜宸卞疄鐜扮伒媧葷殑銆佸彲鎵╁睍鐨勭粍浠舵満鍒躲?/SPAN>
涓?/SPAN>GoF鐨勮璁℃ā寮忕浉鍚岋紝IoC妯″紡鍚屾牱鏄叧娉ㄩ噸鐢ㄦэ紝浣嗕笌GoF妯″紡涓嶅悓鐨勬槸IoC妯″紡鏇村姞鍏蟲敞浜岃繘鍒剁駭鐨勯噸鐢ㄦу拰鍙墿灞曟э紝鍗沖彲浠ョ洿鎺ラ氳繃浜岃繘鍒剁駭榪涜鎵╁厖錛屽鐢ㄧ殑妯″潡閫氬父琚О涓虹粍浠舵垨鑰呮彃浠訛紝緇勪歡鍜屾彃浠墮兘鏄湪榪愯鏃惰繘琛岃杞界殑銆?/SPAN>
GoF鐨勮璁℃ā寮忎腑鎴戜滑澶ч噺鐪嬪埌鐨勬槸闈㈠悜鎺ュ彛緙栫▼錛?/SPAN>Interface Driven Design 鎺ュ彛椹卞姩錛屾帴鍙i┍鍔ㄦ湁寰堝濂藉錛屽彲浠ユ彁渚涗笉鍚岀伒媧葷殑瀛愮被瀹炵幇錛屽鍔犱唬鐮佺ǔ瀹氬拰鍋ュ.鎬х瓑絳夛紝浣嗘槸鎺ュ彛涓瀹氭槸闇瑕佸疄鐜扮殑錛屼篃灝辨槸濡備笅璇彞榪熸棭瑕佹墽琛岋細
AInterface a = new AInterfaceImp();
鐢變簬浠ヤ笂鐨勪唬鐮佽鍐欏叆浜嗚皟鐢ㄨ呯▼搴忎腑錛屽悓鏃惰薄AinterfaceImp榪欐牱鐨勬帴鍙g殑瀹炵幇綾繪槸鍦ㄧ紪璇戞椂琚杞界殑錛屽鏋滀互鍚庢兂鍔犲叆鏂扮殑鎺ュ彛瀹炵幇綾誨垯蹇呴』淇敼璋冪敤鑰呯殑浠g爜銆?/SPAN>
IoC妯″紡涓庝互涓婃儏鍐典笉鍚岋紝鎺ュ彛鐨勫疄鐜扮被鏄湪榪愯鏃惰瑁呰澆鐨勶紝榪欐牱鍗充嬌浠ュ悗鏂版坊鍔犱簡鎺ュ彛瀹炵幇綾繪槸涔熶笉闇淇敼璋冪敤鑰呯殑浠g爜錛堝彲浠ラ氳繃鐗瑰畾鐨勬柟寮忔潵瀹氫綅鏂板鐨勫疄鐜扮被錛屽閰嶇疆鏂囦歡鎸囧畾錛夈?/SPAN>IoC鑻辨枃涓?/SPAN> Inversion of Control錛屽嵆鍙嶈漿妯″紡錛岃繖閲屾湁钁楀悕鐨勫ソ鑾卞潪鐞嗚錛氫綘鍛嗙潃鍒姩錛屽埌鏃舵垜浼氭壘浣犮?/SPAN>
IoC妯″紡鍙互寤剁紦鎺ュ彛鐨勫疄鐜幫紝鏍規嵁闇瑕佸疄鐜幫紝鏈変釜姣斿柣錛氭帴鍙e鍚岀┖鐨勬ā鍨嬪錛屽湪蹇呰鏃訛紝闇瑕佸悜妯″瀷濂楁敞灝勭煶鑶忥紝榪欐牱鎵嶈兘鎴愪負涓涓ā鍨嬪疄浣擄紝鍥犳錛?/SPAN>瀵逛簬榪欎簺鏂扮敓鐨勫鍣紝瀹冧滑鍙嶈漿鐨勬槸鈥滃浣曞畾浣嶆彃浠剁殑鍏蜂綋瀹炵幇鈥濄傚洜姝わ紝 Martin Fowler 緇欒繖縐嶆ā寮忚搗浜嗕竴涓艦璞$殑鍚嶇О鈥滀緷璧栨敞鍏モ?/SPAN>錛?/SPAN>Dependency Injection錛?/SPAN>銆?INPUT class="" id=Image1 title="" type=image src="http://chaocai.cnblogs.com/Files/chaocai/1.jpg" value=Image1>
鍥捐〃 1 閲囩敤Dependency Injection鍓嶅悗鐨勪緷璧栧叧緋誨彉鍖?/SPAN>
渚濊禆娉ㄥ叆鐨勫艦寮忎富瑕佹湁涓夌錛屽垎鍒皢瀹冧滑鍙仛鏋勯犲瓙娉ㄥ叆錛?/SPAN>Constructor Injection錛夈佽鍊兼柟娉曟敞鍏ワ紙Setter Injection錛夊拰鎺ュ彛娉ㄥ叆錛?/SPAN>Interface Injection錛夈?/SPAN>
榪欎笁縐嶆柟寮忓湪Martin Fowler鐨勩?/SPAN>Inversion of Control Containers and the Dependency Injection pattern銆嬩腑閮界粰鍑轟簡璇︾粏鐨勫畾涔夊強璇存槑錛屾湰鏂囧氨涓嶅啀璧樿堪浜嗭紝涓嬮潰鐨勫唴瀹瑰皢鐫閲嶄粙緇?/SPAN>鏋勯犲瓙娉ㄥ叆妯″紡鐨勭壒鐐瑰強瀹炵幇鏂規硶銆?/SPAN>
閫氬父鎯呭喌涓嬭鍊?/SPAN>鏂規硶娉ㄥ叆鍜屾帴鍙f敞鍏ヨ緝鏄撲簬琚紑鍙戜漢鍛樻帴鍙楋紝鑰屾瀯閫犲瓙娉ㄥ叆鍒欏簲鐢ㄨ緝灝戯紝瀹為檯涓婃瀯閫犲瓙娉ㄥ叆鍏鋒湁寰堝鍏朵粬涓よ呮墍涓嶅叿鏈夌殑浼樺娍錛?/SPAN>
1 鏋勯犲瓙娉ㄥ叆褰㈡垚浜嗕竴縐嶆洿寮虹殑渚濊禆濂戠害
2 鍙互鑾峰緱鏇村姞綆鏄庣殑浠g爜
3 鏇村姞綆鏄庣殑渚濊禆澹版槑鏈哄埗錛屾棤欏誨畾涔?/SPAN>XML閰嶇疆鏂囦歡鎴栬鍊?/SPAN>鏂規硶
4 鏇村姞絎﹀悎鎺ュ彛涓庡疄鐜板垎紱葷殑緇勪歡鐗瑰緛錛岀粍浠舵帴鍙h〃鏄庤兘澶熷悜鍏跺畠緇勪歡鎻愪緵鐨勬湇鍔★紝鑰屽疄鐜板垯搴旇鏄墍鎻愪緵鏈嶅姟鐨勫疄鐜板簲璇ヤ笌鏈嶅姟濂戠害鏃犲叧錛堝嵆涓嶅簲鍖呭惈鐢ㄤ簬鑾峰緱渚濊禆鐨勮鍊兼柟娉曠瓑錛夈?/SPAN>
5 涓嶄細鍑虹幇涓嶇‘瀹氱殑鐘舵併傚湪璁懼兼柟娉曟敞鍏ヤ腑錛岀敱浜庡茍涓嶆槸鎵鏈夌殑璁懼兼柟娉曪紙setter錛夐兘涓瀹氫細琚皟鐢ㄧ殑錛屾墍浠ヤ細鏈変笉紜畾鐘舵併?/SPAN>
浠庝互涓婂嚑鐐規垜浠繕鍙互鍒嗘瀽鍑烘瀯閫犲瓙娉ㄥ叆瀵逛簬緇勪歡浠g爜鐨勫叆渚墊ц繙灝忎簬鍏跺畠涓ょ妯″紡(鎺ュ彛娉ㄥ叆浣垮緱緇勪歡蹇呴』瀹炵幇鐗瑰畾鎺ュ彛錛岃鍊兼柟娉曞悓鏍瘋姹傜粍浠舵彁渚涚壒瀹氱殑setter鏂規硶)錛屼唬鐮佹洿鍔犳槗浜庣淮鎶?/SPAN>銆?INPUT class="" id=Image2 title="" type=image src="http://chaocai.cnblogs.com/Files/chaocai/2.jpg" value=Image2>
鍥捐〃 2 紺轟緥涓被鐨勫叧緋?/SPAN>
Client鐨勫疄鐜頒緷璧栦簬鎺ュ彛A銆?/SPAN>B鍜?/SPAN>C鐨勫疄鐜幫紝浣嗘槸涓轟簡鎻愪緵緋葷粺鏇村ソ鐨勭伒媧繪у拰鍙墿灞曟э紝鍚勬帴鍙g殑瀹炵幇浠ョ粍浠剁殑鏂瑰紡鍒╃敤java鐨勫弽灝勬満鍒惰繘琛岃繍琛屾椂瑁呰澆錛屾敞鎰忓埌緇勪歡闂村彲鑳戒細瀛樺湪鏌愮渚濊禆鍏崇郴錛屼緥濡傜粍浠?/SPAN>AX渚濊禆涓庢帴鍙?/SPAN>B鐨勫疄鐜扮被錛岃岃繖涓緷璧栧叧緋誨繀欏誨湪榪愯鏃跺姩鎬佹敞鍏ワ紝緇勪歡涓轟簡鍛婅瘔緇勪歡鐨勮皟鐢ㄨ呰繖縐嶄緷璧栧叧緋諱互渚挎敞鍏ワ紝鍙互浣跨敤涓婃枃鎻愬埌鐨勫悇縐嶆ā寮忥細
1 浣跨敤鎺ュ彛娉ㄥ叆妯″紡
public interface InjectB{
public void injectB(B bImp);
}
public interface InjectC{
public void injectC(C cImp);
}
public class AImp implements A,InjectB,InjectC{
鈥?/SPAN>
public void injectB(B bImp);
public void injectC(C cImp);
鈥?/SPAN>
}
2 浣跨敤璁懼兼敞鍏ユā寮?/SPAN>
public class AImp implements A {
鈥?/SPAN>
public void setB(B bImp);
public void setC(C cImp);
鈥?/SPAN>
}
3 浣跨敤鏋勯犲瓙娉ㄥ叆妯″紡
public class AImp implements A {
鈥?/SPAN>
public AImp(B bImp, C cImp){
鈥?/SPAN>
}
鈥?/SPAN>
}
鐢變互涓婂疄渚嬪彲浠ユ竻妤氱殑鐪嬪嚭閲囩敤鏋勯犲瓙娉ㄥ叆妯″紡鐨勫疄鐜扮粍浠朵唬鐮佹渶涓虹畝鍗曪紝涓旀墍鍙楃殑鍏ヤ鏡鎬ф渶灝忋?/SPAN>
鍦?/SPAN>java鍙?/SPAN>.NET榪欐牱鍏鋒湁鍙嶅皠鍔熻兘鐨勮璦涓疄鐜扮被鍨嬬殑榪愯鏃惰澆鍏ュ茍涓嶅鏉傦紝鍙閫氳繃Class.forName鎴栫敓鎴愯嚜宸辯殑ClassLoader灝卞彲浠ュ疄鐜般?/SPAN>
鍚屾牱鎴戜滑鍙互閫氳繃鍙嶅皠鏈哄埗鑾峰彇緇勪歡鏋勯犲嚱鏁扮殑鍙傛暟錛屾敞鍏ョ浉搴旀帴鍙g殑瀹炵幇錛屼綔鑰呭皢姝よ繃紼嬭繘琛屼簡灝佽錛屼互涓嬫槸浠g爜錛?/SPAN>
public class RefectHelper {
public Object ConstructorHelper(String className,ConstructorParamDeal pd) throws Exception{
try{
//鑾峰彇綾諱腑鐨勬瀯閫犲嚱鏁?/SPAN>
Constructor[] constructs=Class.forName(className).getConstructors(); //瀹炵幇涓粯璁や嬌鐢ㄧ涓涓瀯閫犲嚱鏁扮被鍒涘緩瀹炰緥
Class [] classes=constructs[0].getParameterTypes();
//鑾峰彇瑕佹敞鍏ョ殑鍙傛暟瀹炰緥
Object []obj=pd.dealParam(classes);
//鍒涘緩瀹炰緥
return constructs[0].newInstance(obj);
}catch(Exception e){
throw e;
}
}
}
/**
*鏋勯犲嚱鏁板弬鏁版敞鍏?/SPAN>
**/
public interface ConstructorParamDeal {
/**
*鏍規嵁鏋勯犲嚱鏁頒腑鍙傛暟鐨勭被鍨嬫敞鍏?/SPAN>,鐩稿簲鐨勫疄鐜?/SPAN>
@param classes 鏋勯犲嚱鏁扮殑鍙傛暟綾誨瀷
鈼?/SPAN>return 娉ㄥ叆鏋勯犲嚱鏁扮殑鍙傛暟瀹炵幇
**/
public Object [] dealParam(Class [] classes);
}
public class ParamDeal implements ConstructorParamDeal{
/* (non-Javadoc)
* @see com.topsec.tsm.agent.helper.ConstructorParamDeal#dealParam(java.lang.Class[])
*/
public Object [] dealParam(Class[] classes) {
Object [] obj=new Object[classes.length];
for (int i=0;i<obj.length;i++){
//涓轟笉鍚岀被鍨嬫敞鍏ラ夋嫨涓嶅悓瀹炰緥
if (classes[i].equals(String.class)){
obj[i]=鈥滺ello World鈥?
}
}
return obj;
}
}
涓婇潰鐨勭▼搴忎腑ConstructorHelper鐢ㄤ簬鍒╃敤鍙嶅皠鏈哄埗鏋氫婦鍑鴻澆鍏ョ被鐨勬瀯閫犲嚱鏁板強鏋勯犲嚱鏁扮殑鍙傛暟鐨勭被鍨嬶紝鑷充簬涓嶅悓綾誨瀷娉ㄥ叆浠涔堟牱鐨勫疄渚嬪垯鐢?/SPAN>ContructorParamDeal鐨勫疄鐜拌呮潵鍐沖畾錛?/SPAN>ContructorParamDeal鐨勫疄鐜拌呭悓鏍峰彲浠ヤ互緇勪歡鐨勫艦寮忓湪榪愯鏃跺姩鎬佽澆鍏ャ傜敱浜庣粍浠墮棿鐨勪緷璧栧叧緋葷殑鍒剁害錛屾墍浠ョ粍浠跺疄渚嬪寲鐨勯『搴忛渶瑕佺壒鍒冭檻銆?/SPAN>
涓夌渚濊禆娉ㄥ叆妯″紡鍚勬湁鍏剁壒鐐瑰拰浼樺娍錛屽彧鏈夊厖鍒嗙悊瑙h繖浜涙ā寮忛棿鐨勪笉鍚岋紝鎵嶈兘涓鴻嚜宸辯殑搴旂敤閫夋嫨姝g‘鐨勪緷璧栨敞鍏ユā寮忥紝鏂囦腑浠嬬粛鐨勬瀯閫犲瓙娉ㄥ叆妯″紡瀹炵幇鏂規硶錛屽湪浣跨敤鍏朵粬鍏鋒湁鍙嶅皠鍔熻兘鐨勮璦錛堝錛?/SPAN>.NET錛夋椂鍚屾牱鍙互鍙傝冦?/SPAN>
[鍙傝冩枃鐚?/SPAN>]
1 Martin Fowler,Inversion of Control Containers and the Dependency Injection pattern,http://www.martinfowler.com/articles/injection.html,2004
2 Erich Gamma,Design Patterns,Addison Wesley,1999
3 http://www.picocontainer.org/
4 褰櫒闃?/SPAN>,Ioc妯″紡, http://www.jdon.com,2004