動態代理(CGLIB實現)
CGLIB(Code Generation Library)是一個開源項目。可以直接對類進行增強,而不需要像JDK的動態代理,需要增強的類必須實現某接口
在使用Spring框架時,因為Spring框架中core包中引入了cglib所以如果想通過cglib來實現動態代理,不需要專門的導cglib的jar包。
創建代理工廠時,必須得實現MethodInterceptor接口,因為通過cglib創建的代理對象在調方法時會默認執行intercept方法,通過該方法增加目標對象方法。
public class CglibProxyFactory implements MethodInterceptor {
//通過構造方法,把目標對象傳進來
private Object target;
public CglibProxyFactory(Object target) {
this.target = target;
}
//得到代理對象
public Object getProxyObject() {
Enhancer enhancer = new Enhancer(); //實例化cglib代理增強器-
enhancer.setSuperclass(target.getClass()); //設置目標的類:通過目標類對象來生成代理子對象
enhancer.setCallback(this); //回調方法 參數:回調的對象
return enhancer.create(); // 通過增強器得到代理對象
}
//增強目標對象方法
@Override
public Object intercept(
Object proxy, //代理對象
Method method, //目標對象的方法
Object[] args, //需要增強的方法的參數
MethodProxy proxyMethod //代理對象的方法繼承目標對象的方法(method)
) throws Throwable {
System.out.println("前置增強");
//直接調用目標對象的方法(目標方法執行方式1)
Object value = method.invoke(target, args);
//調用代理代理對象的父類方法,相當於間接調用目標對象的方法(目標方法執行方式2)
Object value = proxyMethod.invokeSuper(proxy, args);
System.out.println("後置增強");
return value;
}
}
動態代理(CGLIB實現)