首页 > 其他分享 >JDK 动态代理 和 CGLIB 动态代理 的区别【SpringAOP】

JDK 动态代理 和 CGLIB 动态代理 的区别【SpringAOP】

时间:2023-06-09 17:44:42浏览次数:36  
标签:JDK 代理 接口 生成 CGLIB 动态

一、原理区别(版本一)

  Java 动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用 InvokeHandler 来处理。

  而 cglib 动态代理是利用 asm 开源包,对代理对象类的 class 文件加载进来,通过修改其字节码生成子类来处理。

  1、如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理实现 AOP。

  2、如果目标对象实现了接口,可以强制使用 CGLIB 实现 AOP。

  3、如果目标对象没有实现了接口,必须采用 CGLIB 库,spring 会自动在 JDK 动态代理和 CGLIB 之间转换。

二、JDK 动态代理和 CGLIB 字节码生成的区别

  1、JDK 动态代理只能对实现了接口的类生成代理,而不能针对类。

  2、CGLIB 是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法因为是继承,所以该类或方法最好不要声明成 final。

 


 

三、原理区别(版本二)

  1、JDK动态代理

    JDK 动态代理只提供接口的代理,不支持类的代理。核心 InvocationHandler 接口和 Proxy 类,InvocationHandler 通过 invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy 利用 InvocationHandler 动态创建一个符合某一接口的实例,生成目标类的代理对象。

  2、CGLIB 动态代理

    如果代理类没有实现 InvocationHandler 接口,那么 SpringAOP 会选择使用 CGLIB 来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态代理的。

四、静态代理和动态代理区别

  静态代理和动态代理区别在于生成 AOP 代理对象的时机不同,相对来说 AspectJ 的静态代理方式具有更好的性能,但是 AspectJ 需要特定的编译器进行处理,而 SpringAOP 则无需特定的编译器处理。

五、补充说明

  InvocationHandler 的 invoke(Object proxy,Method method,Object[] args):proxy是最终生成的代理实例;method 是被代理目标实例的某个具体方法;args 是被代理目标实例某个方法的具体入参,在方法反射调用时使用。

 


 

六、区别(版本三)

  1、JDK 动态代理

    JDK 动态代理是不需要依赖第三方的库,只要 JDK 环境 就可以进行代理,它有几个要求

      1. 实现 InvocationHandler

      2. 使用 Proxy.newProxyInstance 产生代理对象

      3. 被代理的对象必须要实现接口

    使用 JDK 动态代理,目标类必须实现的某个接口,如果某个类没有实现接口,则不能生成代理对象

  2、CGLIB 动态代理

    CGLIB 必须依赖于 CGLIB 的类库,CGLIB 原理是针对目标类生成一个子类,覆盖其中的所有方法,所以目标类和方法不能声明为 final 类型。

    针对接口编程的环境下推荐使用 JDK 的代理。从执行效率上看,CGLIB 动态代理效率较高。在 Hibernate 中的拦截器其实现考虑到不需要其他接口的条件 Hibernate 中的相关代理采用的是 CGLIB 来执行。

标签:JDK,代理,接口,生成,CGLIB,动态
From: https://www.cnblogs.com/Rover20230226/p/17469872.html

相关文章

  • 【Vue2.x】vue2给对象动态添加响应式属性
    1vue2给对象动态添加响应式属性vue2里对象的响应式是通过Object.defineProperty()实现1.1给对象添加单个响应式属性使用Vue.set()或this.$set()参数第一个参数,是目标对象第二个参数,是要添加的属性名字第三个参数,是要属性值1.2给对象批量添加响应式属性使用Object.......
  • 正向代理和反向代理
    正向代理:它代理了客户端,相当于代理服务器去访问目标网址。服务器不知道真正的用户是谁(解决访问问题)1、隐藏用户真实地址信息。因为代理服务器相当于客户端,所以与目标网站直接交互的是代理服务器而非用户。2、突破ip访问限制。使公司内部搭建的局域网链接互联网。......
  • ASEMI代理英飞凌TLD5097EL:理解和使用LED驱动器的综合指南
    编辑-ZTLD5097EL是一款创新的LED驱动器,在照明行业掀起了波澜。这项先进的技术提供了广泛的好处,包括提高能源效率、延长使用寿命和增强性能。在本综合指南中,我们将探讨TLD5097EL的功能和优点,并提供如何有效利用该LED驱动器优化照明解决方案的提示。 什么是TLD5097EL?TLD5097EL是一款......
  • ASEMI代理英飞凌TLE4250-2G汽车级线性稳压器
    编辑-ZTLE4250-2G参数描述:型号:TLE4250-2G输入电压VI:45V输出电压VQ:40V结点温度Tj:-40~150℃储存温度Tstg:-50~150℃输出电容器要求CQ:1µF连接到焊接点RthJSP:30K/W电源纹波抑制PSRR:48dB输出电流限制IQ,max:85mA反向电流IQ:-1mA负输入电压下的反向电流II:-2mA TLE4250-2G特征:50mA输出电......
  • DevExpress 动态创建实例化类 (xpo)
    使用xpo(devexpress)时动态创建一个持久化类。这样方便访问数据库。/*使用DevExpress控件xpoXPObject持久化对象数据库访问表XPObject*///z2011-07-2722:06:[email protected]转载请注明出处classProgram{staticvoidMain(string[]args){XpoD......
  • 【技术积累】算法中的动态规划【二】
    动态规划的优缺点是什么? 动态规划的优点是:可以解决一些复杂的问题,例如背包问题、最长公共子序列问题等;可以通过记忆化搜索来避免重复计算,提高效率;可以通过状态转移方程来简化问题,使问题更易于理解和解决;可以处理连续的问题,例如最大子段和问题。动态规划的缺点是:对于某......
  • Golang 配置代理
    通过 goget 命令下载各种依赖时,经常需要访问github/google等网站。配置好代理后,可以快速稳定的访问。常用的go代理goproxyhttps://goproxy.io/zh/阿里云https://mirrors.aliyun.com/goproxy/七牛云https://goproxy.cn设置go代理go1.13及以上版本可以直接用下面......
  • #Vue-cli 5 怎么打印代理地址 #Vue-cli 5 怎么查看真是请求地址 ?
    proxy:{'/api':{target:'http://192.168.3.47:1228',changeOrigin:true,onProxyReq:function(proxyReq,req,res){console.log('[proxy]:'+proxyReq.getHeader('origin')+proxyReq.p......
  • python tkinter 动态批量建立Widget时,combobox 或 entry传递参数问题
    terminal_combobox.bind('<<ComboboxSelected>>',lambdaevent,arg=key_dict:self.terminal_select(key_dict=arg))#注意,传递参数方法defterminal_select(self,key_dict,*args):var=self.dict_widget[key_d......
  • TLE6208-6G-ASEMI代理英飞电机驱动芯片TLE6208-6G
    编辑:llTLE6208-6G-ASEMI代理英飞电机驱动芯片TLE6208-6G型号:TLE6208-6G品牌:Infineon(英飞凌)封装:SOP-28类型:LED驱动、汽车芯片TLE6208-6G产品概述TLE6208-6G是一款完全保护的六角半桥驱动器,专为汽车和工业运动控制应用而设计。该部件基于英飞凌智能电源技术SPT®,该技术允许双极和......