轉(zhuǎn)帖|行業(yè)資訊|編輯:郝浩|2016-02-25 11:55:03.000|閱讀 1221 次
概述:要了解Spring的AOP就必須先了解的動態(tài)代理的原理,因為AOP就是基于動態(tài)代理實現(xiàn)的。動態(tài)代理還要從JDK本身說起。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
前面介紹了Spring容器的構(gòu)建過程,那Spring能為我們做什么,Spring的Ioc容器又能做什么呢?我們使用Spring必須要首先構(gòu)建Ioc容器,沒有它Spring無法工作,ApplicatonContext.xml就是Ioc 容器的默認配置文件,Spring的所有特性功能都是基于這個Ioc容器工作的,比如后面要介紹的AOP。
Ioc它實際上就是為你構(gòu)建了一個魔方,Spring為你搭好了骨骼架構(gòu),這個魔方到底能變出什么好的東西出來,這必須要有你的參與。那我們怎么參與?這就是前面說的要了解Spring中那有些擴展點 ,我們通過實現(xiàn)那些擴展點來改變Spring的通用行為。至于如何實現(xiàn)擴展點來得到我們想要的個性結(jié)果,Spring中有很多例子,其中AOP的實現(xiàn)就是Spring本身實現(xiàn)了其擴展點來達到了它想要的特性功能 ,可以拿來參考。
要了解Spring的AOP就必須先了解的動態(tài)代理的原理,因為AOP就是基于動態(tài)代理實現(xiàn)的。動態(tài)代理還要從JDK本身說起。
在Jdk的java.lang.reflect包下有個Proxy類,它正是構(gòu)造代理類的入口。這個類的結(jié)構(gòu)入下:
從上圖發(fā)現(xiàn)最后面四個是公有方法。而最后一個方法newProxyInstance就是創(chuàng)建代理對象的方法。這個方法的源碼如下:
public static Object newProxyInstance(ClassLoader loader, Class> [] interfaces, InvocationHandler h) throws IllegalArgumentException { if (h == null) { throw new NullPointerException(); } Class cl = getProxyClass (loader, interfaces); try { Constructor cons = cl.getConstructor(constructorParams); return (Object) cons.newInstance(new Object[] { h }); } catch (NoSuchMethodException e) { throw new InternalError(e.toString()); } catch (IllegalAccessException e) { throw new InternalError(e.toString()); } catch (InstantiationException e) { throw new InternalError(e.toString()); } catch (InvocationTargetException e) { throw new InternalError(e.toString()); } }
這個方法需要三個參數(shù):ClassLoader,用于加載代理類的Loader類,通常這個Loader和被代理的類是同一個Loader類。Interfaces,是要被代理的那些那些接口。InvocationHandler,就是用于執(zhí)行 除了被代理接口中方法之外的用戶自定義的操作,他也是用戶需要代理的最終目的。用戶調(diào)用目標方法都被代理到InvocationHandler類中定義的唯一方法invoke中。這在后面再詳解。
下面還是看看Proxy如何產(chǎn)生代理類的過程,他構(gòu)造出來的代理類到底是什么樣子?下面揭曉啦。
其實從上圖中可以發(fā)現(xiàn)正在構(gòu)造代理類的是在ProxyGenerator的generateProxyClass的方法中。ProxyGenerator類在sun.misc包下,感興趣的話可以看看他的源碼。
假如有這樣一個接口,如下:
public interface SimpleProxy { public void simpleMethod1(); public void simpleMethod2(); }
代理來生成的類結(jié)構(gòu)如下:
public class $Proxy2 extends java.lang.reflect.Proxy implements SimpleProxy{ java.lang.reflect.Method m0; java.lang.reflect.Method m1; java.lang.reflect.Method m2; java.lang.reflect.Method m3; java.lang.reflect.Method m4; int hashCode(); boolean equals(java.lang.Object); java.lang.String toString(); void simpleMethod1(); void simpleMethod2(); }
這個類中的方法里面將會是調(diào)用InvocationHandler的invoke方法,而每個方法也將對應(yīng)一個屬性變量,這個屬性變量m也將傳給invoke方法中的Method參數(shù)。整個代理就是這樣實現(xiàn)的。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn