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的加强办法。