动态代理-CGLIB
一:概念
-
被代理对象,我们的业务类,也是AOP中的增强方法
-
方法拦截器MethodInterceptor,代理类(动态生成的代理类继承自被代理对象)
-
Enhance代理对象生成工具
二:与Proxy区别
-
JDK Proxy 是通过拦截器加反射的方式实现的;
-
JDK Proxy 只能代理继承接口的类;
-
JDK Proxy 实现和调用起来比较简单;
-
CGLib 是第三方提供的工具,基于 ASM 实现的,性能比较高;
-
CGLib 无需通过接口来实现,它是通过实现子类的方式来完成调用的。
三:代码实现
package com.test.annotation;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
//CGLIB代理
public class CGLIBProxyTest {
public static void main(String[] args) throws ClassNotFoundException {
// 创建加强器,用来创建动态代理类
Enhancer enhancer = new Enhancer();
// 为代理类指定需要代理的类,也即是父类
enhancer.setSuperclass(Dog.class);
// 设置方法拦截器回调引用,对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept() 方法进行拦截
enhancer.setCallback(new CglibMethodInterceptor());
// 创建cglib 代理类
Dog poolDog = (Dog) enhancer.create();//
poolDog.call("123");
}
}
//CGLIB代理回调方法实现
class CglibMethodInterceptor implements MethodInterceptor {
/**
* 动态生成的代理类(继承Dog,含有call方法),call方法会调用该方法
*
* @param object 动态生成的代理类
* @param method call方法
* @param args call参数
* @param methodProxy
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("before");
Object result = methodProxy.invokeSuper(object, args);//调用父类call方法
System.out.println("after");
return result;
}
}
class Dog {
public String call(String ss) {
System.out.println("wang wang wang");
return "Dog ..";
}
}