锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 浠g爜錛?br />
public interface BusinessProcess{ public class BusinessProcessImpl implements BusinessProcess{ 濡傛灉瑕佸BusinessProcessImpl澧炲姞鏉冮檺楠岃瘉鍔熻兘錛岄偅涔堥潤鎬佷唬鐞嗕唬鐮侊細 瀵逛簬鍔ㄦ佷唬鐞? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 嫻嬭瘯浠g爜錛?br />
BusinessProcessImpl impl = new BusinessProcessImpl(); 娉ㄦ剰錛?br />
proxy瀵硅薄鏄疊usinessProcess鎺ュ彛鐨勪竴涓疄鐜扮被錛屼絾鏄笉鏄疊usinessProcessImpl鐨勫瓙綾?/p>
鍔ㄦ佷唬鐞嗙殑瀹炵幇鍘熺悊錛?br />
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces); 絎竴嬈′負鏌愪釜object鐢熸垚proxyClass鍙兘姣旇緝鑰楄垂鎬ц兘錛屼絾鏄疨roxy鏂規硶浣滀簡緙撳瓨錛屽彲浠ュ譏琛ヨ繖涓鐐廣傛澶栵紝鍔ㄦ佷唬鐞嗗彧鑳藉瀵筰nterfaces榪涜鍔ㄦ佺殑浠g悊, 涔熷氨鏄瀹冨厛鎵懼嚭闇瑕佷唬鐞嗙殑瀵硅薄瀹炵幇鐨勬墍鏈夌殑interface, 鐒跺悗鍙鎵鏈夌殑榪欎簺interface鐨勬墍鏈夌殑鏂規硶浠g悊錛屽璞¢櫎浜唅nterfaces浠ュ鐨勬柟娉曚笉浜堝鐞嗐?/p>
]]>
void processBusiness();
}
public void processBusiness(){
System.out.println("in businessProcessImpl");
}
}
public class BusinessProcessProxy implements BusinessProcess{
private BusinessProcess target;
public BusinessProcessProxy(BusinessProcess target){
this.target = target;
}
public void processBusiness(){
checkPermission();
this.target.processBusiness();
}
}
public class PermissionHandler implements InvocationHandler {
private Object target;
public LoggerHandler(Object target){
this.target = target;
}
checkPermission();
Object result = method.invoke(this.target,args);
return result;
}
}
PermissionHandler handler = new PermissionHandler (impl);
BusinessProcess proxy = (BusinessProcess)Proxy.newProxyInstance(impl.getClass().getClassLoader(),impl.getClass().getInterfaces(), handler);
proxy.processBusiness();
鐪嬭搗鏉ュソ鍍忛潤鎬佷唬鐞嗗拰鍔ㄦ佷唬鐞嗘病浠涔堝尯鍒紝浣嗘槸浠旂粏涓鐪嬶紝闈欐佷唬鐞嗕唬鐞嗙殑target鍙兘鏄疊usinessProcess瀵硅薄錛岃屽姩鎬佷唬鐞嗗嵈鑳藉浠g悊浠諱綍涓涓狾bject瀵硅薄錛岃繖灝辨槸鍏抽敭鍖哄埆銆傛墍浠ョ▼搴忎腑涓嶉渶瑕佷負姣忎釜鏍稿績綾誨啓涓涓狿roxy錛岃屽叕鐢ㄤ竴涓氨鍙互銆?/p>
proxyClass = defineClass0(loader, proxyName,proxyClassFile, 0,proxyClassFile.length);
榪欐槸java.lang.reflect.Proxy鐨勪袱琛屽叧閿唬鐮侊紝絎竴琛屼唬鐮佺敓鎴愬悕涓簆roxyName, 瀹炵幇鐨勬帴鍙d負interfaces鐨勪竴涓被鐨勫瓧鑺傜爜銆?br />
絎簩琛屼唬鐮侊紝灝嗙敓鎴愮殑瀛楄妭鐮佹敞鍏ュ埌classloader涓幓銆?/p>
涓涓湅鍙嬪彂浜嗗皝mail闂簡鍑犱釜闂錛屽叾涓殑涓涓槸鍏充簬IoC鍜孌I鐨勶細
Inversion of Control鍜孌ependency Injection 鏄粈涔堝叧緋伙紝鎴戣涓轟袱涓瘝浠h〃鐨勬槸鍚屼竴涓剰鎬濓紝鍙槸涓ょ涓嶅悓鐨勮〃紺猴紝瀵瑰悧錛?/span>
涓嬮潰鏄垜瀵硅繖涓棶棰樼殑涓浜涚悊瑙c?br /> 鍑嗙‘鐨勮錛孖oC鍜孌I騫朵笉鐩稿悓錛岃繖涓鐐逛粠瀛楅潰涓婂氨鍙互鐪嬪嚭錛屽惁鍒欙紝瀹冧滑鍙互鍙竴涓悕瀛椼俕_^
鐞嗚ВIoC錛屾垜浠渶瑕佺煡閬揅ontrol鏄粈涔堬紝瀹冨張鏄庢牱琚獻nversion鐨勩傚叾瀹烇紝IoC鏄敤鏉ヨ鏄?#8220;紼嬪簭搴?#8221;鍜?#8220;妗嗘灦”鍖哄埆鐨勬渶濂借瘉鎹傚湪浣跨敤紼嬪簭搴撶殑鏃跺欙紝鎺у埗鏉冩槸鎺屾彙鍦ㄦ垜浠墜涓殑錛屾垜浠紪鍐欑殑浠g爜璋冪敤紼嬪簭搴撶殑瀹炵幇錛屽畬鎴愮浉搴旂殑鍔熻兘錛屾兂鎯蟲垜浠嬌鐢↗DK鐨勬儏鍐點備嬌鐢ㄦ鏋剁殑鏃跺欙紝鎺у埗鏉冨垯鎺屾彙鍦ㄦ鏋舵墜涓紝鎴戜滑鐨勪唬鐮佹渶緇堟槸鐢辨鏋惰皟鐢?/strong>錛屼竴涓父瑙佺殑渚嬪瓙鏄疭ervlet錛屾垜浠紪鍐欑殑Servlet浠g爜鏄斁鍦ㄦ暣涓猄ervlet鐨勬鏋朵腑錛岀敱Web瀹瑰櫒榪涜璋冪敤銆傝繖灝辨槸宸紓鎵鍦ㄣ傛垜浠洿涔犳儻浜庤嚜宸辨帉鎺т竴鍒囷紝鍥犳錛屽妗嗘灦鎺屾彙鎺у埗鏉冪殑榪欑鎯呭喌錛屾垜浠敤“Inversion”鏉ュ艦瀹癸紝榪欎篃鏄疢artin Fowler鍦ㄩ偅綃囩粰DI姝e悕鐨勬枃绔犱腑鎻愬埌錛屾墍鏈夋鏋墮兘鏄疘oC鐨勫師鍥犮?/span>
Spring鐨勬牳蹇冨鍣ㄦ槸涓涓鏋訛紝鎵浠ワ紝鎴戜滑鍙互璇村畠鏄疘oC錛屼絾鏄氨濡傚墠闈㈡墍璇達紝姣忎釜妗嗘灦閮芥湁IoC錛屾墍浠ワ紝浠呬粎鐢↖oC鏄笉瓚充互璇存槑涓鍒囩殑銆?strong>Spring鏍稿績瀹瑰櫒瀹屾垚鐨勬槸緇勪歡緇勮鐨勮繃紼嬶紝榪欐槸瀹冨拰鍏跺畠鏅氭鏋跺尯鍒渶涓烘樉钁楃殑鍦版柟銆傚鏋滆鐢↖oC鎻忚堪榪欎釜妗嗘灦錛岄偅涔堬紝榪欓噷鎵鎸囩殑Control瀹為檯涓婃槸緇勪歡鐨勭粍瑁呰繃紼嬨?br />
绔欏湪Spring鏍稿績瀹瑰櫒鐨勫眰闈笂鐪嬶紝瀹冨畬鎴愮粍瑁呰繃紼嬫槸鎶婄粍浠舵墍渚濊禆鐨勯浂閮ㄤ歡緇欑粍浠跺畨瑁呬笂鍘匯傜珯鍦ㄥ崟涓粍浠跺眰闈笂鐪嬶紝瀹冩墍闇瑕佺殑闆墮儴浠舵槸鐢卞閮ㄧ粰瀹冨畨瑁呯殑錛岃繖涓繃紼嬪氨鍍忔槸鎶?#8220;Dependency”榪欑鑽按鐢ㄦ敞灝勫櫒“Injection”鍒扮粍浠剁殑韜綋涓幓錛屾墍浠ワ紝鎴戜滑縐頒箣涓?#8220;Dependency Injection”銆?/span>
瀹屾垚緇勪歡緇勮鐨勫鍣ㄤ篃涓嶅彧鏄敞鍏ヤ竴縐嶅艦寮忥紝榪樻湁涓縐嶅父瑙佺殑鏂瑰紡鏄?#8220;Dependency Lookup”錛屽嵆姣忎釜緇勪歡鑷繁鍘繪煡鎵捐嚜宸辨墍闇瑕佺殑鍐呭銆傝嚦浜庡埌鍝幓鎵撅紝涔熸湁涓嶅悓鐨勫疄鐜版柟寮忥紝鏈夊浐瀹氬埌鏌愪釜鍦版柟錛堟瘮濡備嬌鐢ㄩ潤鎬佹柟娉曪級錛屾湁鎶婃煡鎵劇偣閫氳繃DI鐨勬柟寮忔敞鍏ヨ繘鏉ョ瓑絳夈?/span>
Martin Fowler鐨勬枃绔犲凡緇忓緢娓呮鐨勮В閲婁簡IoC鍜孌I榪欎袱涓蹇碉紝鎴戜滑鍙渶瑕佸幓緇嗙粏鍝佸懗銆?/span>