关于CGLIB代理的流程
・JDK动态代理需要使用接口实现,
如果目标对象没有实现接口,就需要使用CGLIB代理
・CGLIB代理使用的核心类Enhancer,在 CGLIB代理中设置代理对象以及设置回调函数
・CGLIB中代理类实现的接口与JDK代理对象不同
JDK代理 → InvocationHandler
CGLIB代理 →MethodInterceptor
下面呈现CGLIB代理实现的全部过程
※请手实测 转载请注明出处
①引包请参见「关于JDK动态代理执行过程」这篇文章
②创建目标类
package cglib;
public class UserOper {
public void addUser() {
System.out.println("执行addUser方法");
}
public void delUser() {
System.out.println("执行delUser方法");
}
}
③创建类及其相关方法
package cglib;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import aspect.Myspect;
public class CglibProxy implements MethodInterceptor {
/**
* 生成代理对象方法
*
* @param targer
* @return 代理对象
*/
public Object createProxy(Object targer) {
// 创建核心对象enhancer
Enhancer enhancer = new Enhancer();
// 确认增强类
enhancer.setSuperclass(targer.getClass());
// 设置回调函数
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 代理对象执行的方法
*
* @param proxyObj
* CGLIB父类生成的代理对象
* @param method
* 被拦截的 方法 本例指的是 addUser()和delUser()
* @param arg
* 参数
* @param methodProxy
* 方法的代理对象 执行父类的方法
* @return
*/
public Object intercept(Object proxyObj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
// 创建切面类对象
Myspect myspect = new Myspect();
// 拦截前执行切面方法
myspect.beforeExcute();
// 目标方法的执行(重要)
Object object = methodProxy.invokeSuper(proxyObj, arg);
// 拦截后执行切面方法
myspect.afterExcute();
return object;
}
}
④测试类
package cglib;
public class TestCglibProxy {
public static void main(String[] args) {
UserOper userOper = new UserOper();
CglibProxy cglibProxy = new CglibProxy();
UserOper userOperProxy = (UserOper) cglibProxy.createProxy(userOper);
userOperProxy.addUser();
userOperProxy.delUser();
}
}
⑤运行结果
check
执行addUser方法
over
check
执行delUser方法
over
※请手实测 转载请注明出处