当前位置: 首页 > 后端技术 > Java

每日一文-8.2-CGlib与JDKProxy的区别

时间:2023-04-02 01:16:38 Java

CGlib为什么要实现拦截器方法?CGlib是通过拦截器实现的。CGLib采用底层字节码技术,全称:CodeGenerationLibrary,CGLib可以为一个类创建子类,并在子类中使用方法拦截技术拦截所有父类方法调用,并沿途编织横切逻辑.所以跑得比JDK快。(参考https://cloud.tencent.com/dev...)}publicObjectintercept(Objectobject,Methodmethod,Object[]args,MethodProxymethodProxy)throwsThrowable{returnthis.doInvoke(method,args);}}publicinterfaceMethodInterceptorextendsCallback{Objectintercept(Objectvar1,Methodvar2,Object[]var3,MethodProxyvar4)throwsThrowable;}JDKProxyJDKProxy是Java语言的内置函数,不需要自己实现加载第三方类。Spring的动态代理首先是通过JDK实现的。JDKProxy主要涉及java.lang.reflect包下的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现接口来定义横切逻辑,并通过反射机制调用目标类的代码,将横切逻辑和业务逻辑动态编织在一起。InvocationHandler是代理实例的调用处理器实现的接口。每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用被编码并分派到其调用处理程序的调用方法。类JdkProxyHandlerextendsBaseProxyHandlerimplementsInvocationHandler{JdkProxyHandler(TpooledObject,UsageTrackingusageTracking){super(pooledObject,usageTracking);}publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throws{returnthis.doInvoke(method,args);}}JDK动态代理具体实现原理:通过实现InvocationHandler接口创建自己的调用处理器;通过为Proxy类指定一个ClassLoader对象和一组接口来创建一个动态代理;通过反射机制获取动态代理类的构造函数,其唯一参数类型为调用处理器的接口类型;通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数;JDK动态代理是一种面向接口的代理模式。如果代理目标没有接口,那么Spring什么也做不了。Spring通过Java反射机制产生了一个新的代理接口的匿名实现类,并重写了AOP的增强方法。