天天看點

spring中的設計模式(二)

JDK的動态代理首先看InvocationHandler接口

public

interface InvocationHandler

    extends Callback

{

    public

abstract Objectinvoke(Object obj, Methodmethod, Object

aobj[])

        throws Throwable;

}

這個接口隻有一個invoke方法

第一個參數是代理的真實的對象

第二個參數是調用真實對象的方法

第三個是調用方法需要的參數

再看下Proxy類,用的最多的是裡面的newProxyInstance方法

class Proxy

    implements Serializable

   public

static Object newProxyInstance(ClassLoader loader, Class     interfaces[], InvocationHandler h)

    {

        Class clazz = getProxyClass(loader,interfaces);

        return clazz.getConstructor(new Class[] {

           org.springframework.cglib.proxy.InvocationHandler.class

        }).newInstance(new Object[] {

            h

        });

        RuntimeException e;

        e;

        throw e;

        throw

newCodeGenerationException(e);

    }

這個方法的第一個參數是一個ClassLoader對象,定義了由哪個ClassLoader對象來生成代理對象進行加載

第二個參數是一個interfaces的數組,表示我将要給我代理的對象提供什麼接口,這樣生成代理的對象的時候就可以調用這些接口裡面的方法

第三個參數是一個InvocationHandler對象,表示這個動态代理對象調用方法的時候會關聯到哪個invocationHandler對象

在整個動态代理模式中,每一個代理類都要實作InvocationHandler接口,每一個代理類對象都是一個InvocationHandler對象

這個代理類提供了一個構造方法,參數是Object 類,代表這個代理類對象生成時真正代理的對象

在代理類裡面會執行Method對象的invoke方法執行真實對象的方法

而在用戶端我們會先通過這個代理類得到InvocationHandler對象

然後通過Proxy類的newProxyInstance方法去得到這個真實的對象,然後調用

整個的流程應該是

spring中的設計模式(二)

說到動态代理,就不得不提到spring的Aop的實作

Aop的動态代理實作需要四個角色,被代理的類,被代理的接口,織入器,和切面

Proxy.newProxyInstance就是織入器,InvocationHandler是切面,首先織入器利用接口反射機制生成代理類,然後在這個代理類中織入方法,織入的是切面的方法,spring中預設的是動态代理機制試下Aop,因為動态代理機制下代理類必須要實作接口,如果代理類沒有實作接口,則采用CGlib機制實作Aop,CGlib機制後續再進行補充