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的核心實現原理就是採用的動態代理,根據被代理對象是否實現了所要被代理的接口這個條件,動態代理會選擇不同的實現方案。