1. 程式人生 > >Spring架構詳解之動態代理的實現原理

Spring架構詳解之動態代理的實現原理

前面介紹了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類,它正是構造代理類的入口。這個類的結構入下:

Bean例項建立流程圖 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