关于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

※请手实测 转载请注明出处

 

posted @ 2019-11-03 19:07  工设091  阅读(272)  评论(0编辑  收藏  举报