AOP实现原理之CGLIB动态代理
实现GLIB动态代理必须实现MethodInterceptor(方法拦截器)接口,源码如下
public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,
MethodProxy proxy) throws Throwable;
这个接口又4个参数:
1)obj表示增强的对象,即实现这个接口类的一个对象;
2)method表示要被拦截的方法;
3)args表示要被拦截方法的参数;
4)proxy表示要触发父类的方法对象;
在上面的Client代码中,通过Enhancer.create()方法创建代理对象,create()方法的源码:
该方法含义就是如果有必要就创建一个新类,并且用指定的回调对象创建一个新的对象实例
实现过程
<dependencies>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
代理类重写MethodInterceptor接口并重写intercept方法
public class AlipayMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
before();
Object o1 = methodProxy.invokeSuper(o, args);
after();
return o1;
}
private void before(){
System.out.println("方法执行前");
}
private void after(){
System.out.println("方法执行后");
}
}
通过cglib获取代理对象的过程
public class CglibUtil {
public static <T> T createProxyDemo(T target, MethodInterceptor methodInterceptor){
T o = (T)Enhancer.create(target.getClass(), methodInterceptor);
return o;
}
}
要代理的对象
public class CommonPayment {
public void pay(){
System.out.println("全部支付通道");
}
}
测试方法
public class AlipayDemo {
public static void main(String[] args) {
CommonPayment commonPayment = new CommonPayment();
AlipayMethodInterceptor alipayMethodInterceptor = new AlipayMethodInterceptor();
CommonPayment proxyDemo = CglibUtil.createProxyDemo(commonPayment, alipayMethodInterceptor);
proxyDemo.pay();
}
}
实现原理:cglib采取底层的字节码技术ASM,可以为一个类创建子类,在子类中采取方法拦截的技术拦截所有父类的方法调用,并注入横切逻辑