Spring AOP動態代理

Spring AOP中使用了兩種動態代理:
一種是JDK的動態代理:JDK的動態代理必須指定接口,這些接口都是已經被代理對象實現了的;
一種CGLIB的動態代理:CGLIB代理則不需要指定接口。

這裏我主要用測試代碼來重點解釋JDK的動態代理。
其jdk代理的核心其實就是實現InvocationHandler接口,然後通過Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)獲得動態代理對象。
首先我們需要一個目標類接口:

public interface JdkProxyInterface {
    void run();
}

第二,我的需要目標列實現這個接口:

public class JDKProxyTestServiceImpl implements JdkProxyInterface {
    @Override
    public void run() {
        System.out.println("do something...");
    }
}

第三、jdk代理的核心其實就是實現InvocationHandler接口:

class TestJDKProxy implements InvocationHandler {
    //代理目標對象
    private Object targetObject;

    //構造代理對象、通過反射實現
    public Object newProxy(Object targetObject) {
        this.targetObject = targetObject;
        return Proxy.newProxyInstance(
                targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(),
                this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Mock transaction start...");

        //原執行邏輯
        Object ret = method.invoke(targetObject, args);

        System.out.println("Mock transaction commit...");
        
        return ret;
    }
}

至此,JDK動態代理完成。
總結
Spring AOP的核心實現原理就是採用的動態代理,根據被代理對象是否實現了所要被代理的接口這個條件,動態代理會選擇不同的實現方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章