0
点赞
收藏
分享

微信扫一扫

【cglib动态代理】

得一道人 2022-03-11 阅读 48

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,可以为一个类创建子类,在子类中采取方法拦截的技术拦截所有父类的方法调用,并注入横切逻辑

举报

相关推荐

0 条评论