共计 1446 个字符,预计需要花费 4 分钟才能阅读完成。
CGlib 为什么要实现拦截器的办法
CGlib 是通过拦截器实现的。
CGLib 采纳底层的字节码技术,全称是:Code Generation Library,CGLib 能够为一个类创立一个子类,在子类中采纳办法拦挡的技术拦挡所有父类办法的调用并趁势织入横切逻辑,所以运行比 JDK 快。(参照 https://cloud.tencent.com/dev…)
class CglibProxyHandler<T> extends BaseProxyHandler<T> implements MethodInterceptor {CglibProxyHandler(T pooledObject, UsageTracking<T> 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<T> extends BaseProxyHandler<T> implements InvocationHandler {JdkProxyHandler(T pooledObject, UsageTracking<T> 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 的加强办法。