Spring架構詳解之動態代理的實現原理
阿新 • • 發佈:2019-01-01
前面介紹了Spring容器的構建過程,那Spring能為我們做什麼,Spring的Ioc容器又能做什麼呢?我們使用Spring必須要首先構建Ioc容器,沒有它Spring無法工作,ApplicatonContext.xml就是Ioc 容器的預設配置檔案,Spring的所有特性功能都是基於這個Ioc容器工作的,比如後面要介紹的AOP。
Ioc它實際上就是為你構建了一個魔方,Spring為你搭好了骨骼架構,這個魔方到底能變出什麼好的東西出來,這必須要有你的參與。那我們怎麼參與?這就是前面說的要了解Spring中那有些擴充套件點 ,我們通過實現那些擴充套件點來改變Spring的通用行為。至於如何實現擴充套件點來得到我們想要的個性結果,Spring中有很多例子,其中AOP的實現就是Spring本身實現了其擴充套件點來達到了它想要的特性功能 ,可以拿來參考。
要了解Spring的AOP就必須先了解的動態代理的原理,因為AOP就是基於動態代理實現的。動態代理還要從JDK本身說起。
在Jdk的java.lang.reflect包下有個Proxy類,它正是構造代理類的入口。這個類的結構入下:
Proxy類結構從上圖發現最後面四個是公有方法。而最後一個方法newProxyInstance就是建立代理物件的方法。這個方法的原始碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
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
|