每日一篇-8.2-CGlib和JDKProxy区别

CGlib为什么要实现拦截器的方法

CGlib是通过拦截器实现的。
CGLib采用底层的字节码技术,全称是:Code Generation Library,CGLib可以为一个类创建一个子类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑,所以运行比JDK快。(参照https://cloud.tencent.com/dev...

class CglibProxyHandler extends BaseProxyHandler implements MethodInterceptor {
    CglibProxyHandler(T pooledObject, UsageTracking usageTracking) {
        super(pooledObject, usageTracking);
    }

    public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        return this.doInvoke(method, args);
    }
}
public interface MethodInterceptor extends Callback {
    Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable;
}

JDK Proxy

JDK Proxy 是 Java 语言自带的功能,无需通过加载第三方类实现。Spring的动态代理就是优先通过JDK实现的。JDK Proxy主要涉及java.lang.reflect包下边的两个类:Proxy和InvocationHandler。其中,InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态地将横切逻辑和业务逻辑编织在一起。

InvocationHandler 是代理实例的调用处理程序实现的接口。每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用被编码并分派到其调用处理程序的调用方法。

class JdkProxyHandler extends BaseProxyHandler implements InvocationHandler {
    JdkProxyHandler(T pooledObject, UsageTracking usageTracking) {
        super(pooledObject, usageTracking);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return this.doInvoke(method, args);
    }
}

JDK动态代理具体实现原理:
通过实现InvocationHandler接口创建自己的调用处理器;
通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理;
通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型;
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入;
JDK动态代理是面向接口的代理模式,如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生产被代理接口的新的匿名实现类,重写了其中AOP的增强方法。

你可能感兴趣的:(java)