Spring:AOP-基於cglib的動態代理
cglib是一個第三方框架,專門做代理的。Spring集成了它。
cglib實現代理是**基於“類繼承”**的:代理對象是繼承目標對象的,是父子關係,子加強了父。
實現步驟:
1、創建目標對象 Target
2、創建增強對象 Advice
3、創建代理對象類 MyProxy
4、編寫測試代碼
1、創建目標對象 Target
public class Target{
public void save() {
System.out.println("Target: save() running...");
}
}
2、創建增強對象 Advice
public class Advice {
public void before(){
System.out.println("前置增強...");
}
public void afterReturning(){
System.out.println("後置增強...");
}
}
3、創建代理對象類 MyProxy
public class MyProxy {
// 定義目標對象、增強對象
private Target target = new Target();
private Advice advice = new Advice();
public Target getProxy(){
// 創建增強對象
Enhancer enhancer = new Enhancer();
// 給增強對象設置父類
enhancer.setSuperclass(Target.class);
// 設置回調函數
// public void setCallback(Callback callback)
enhancer.setCallback(new MethodInterceptor() {
/**
* SpringMVC中的攔截器:方法攔截器
* @param proxy 代理對象
* @param method 目標方法對象
* @param args 目標方法參數
* @param methodProxy 方法代理
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//前置增強
advice.before();
//反射調用目標方法
Object obj = method.invoke(target, args);
//後置增強
advice.afterReturning();
return obj;
}
});
//創建代理對象
Target proxy = (Target) enhancer.create();
return proxy;
}
}
4、編寫測試代碼
測試包下寫
public class CglibProxyTest {
/**
* 測試基於cglib的動態代理
*/
@Test
public void test01(){
//創建代理對象
Target proxy = new MyProxy().getProxy();
//通過代理對象調用目標方法
proxy.save();
}
}
控制檯打印內容:
前置增強...
Target: save() running...
後置增強...