标签:子类 JDK spring 代理 接口 CGLib aop 方法
spring aop中有两种代理模式,一种是jdk动态代理,另外一种是cglib代理。
jdk动态代理:
是当需要被代理的类实现了某一个接口,那么此时spring aop会使用jdk动态代理,会再创建一个代理类来实现被代理类实现的接口,此时会在代理类中重写接口中的方法,并将被代理类注入进来,
代理类调用切面,并调用被代理类中需要代理的方法,由于代理类实现的是被代理类的接口,所以只能代理接口中有的方法,而只属于被代理类的方法则不能被代理
优点:
JDK
动态代理是JDK
原生的,不需要任何依赖即可使用;- 通过反射机制生成代理类的速度要比
CGLib
操作字节码生成代理类的速度更快;
缺点:
- 如果要使用
JDK
动态代理,被代理的类必须实现了接口,否则无法代理; JDK
动态代理无法为没有在接口中定义的方法实现代理,假设我们有一个实现了接口的类,我们为它的一个不属于接口中的方法配置了切面,Spring
仍然会使用JDK
的动态代理,但是由于配置了切面的方法不属于接口,为这个方法配置的切面将不会被织入。JDK
动态代理执行代理方法时,需要通过反射机制进行回调,此时方法执行的效率比较低;
cglib代理:
则是在字节码层面,当被代理类没有实现某一个接口,那么spring aop则会调用cglib代理,在字节码层面创建一个被代理类的子类,创建的子类与自己手写的子类并无多大区别,此时只需要重写被代理类中的方法就好,因为代理类继承了被代理类,所以可以对被代理类中所有的方法进行代理
优点:
- 使用
CGLib
代理的类,不需要实现接口,因为CGLib
生成的代理类是直接继承自需要被代理的类; CGLib
生成的代理类是原来那个类的子类,这就意味着这个代理类可以为原来那个类中,所有能够被子类重写的方法进行代理;CGLib
生成的代理类,和我们自己编写并编译的类没有太大区别,对方法的调用和直接调用普通类的方式一致,所以CGLib
执行代理方法的效率要高于JDK
的动态代理;
缺点:
- 由于
CGLib
的代理类使用的是继承,这也就意味着如果需要被代理的类是一个final
类,则无法使用CGLib
代理; - 由于
CGLib
实现代理方法的方式是重写父类的方法,所以无法对final
方法,或者private
方法进行代理,因为子类无法重写这些方法; CGLib
生成代理类的方式是通过操作字节码,这种方式生成代理类的速度要比JDK
通过反射生成代理类的速度更慢
标签:子类,JDK,spring,代理,接口,CGLib,aop,方法 来源: https://www.cnblogs.com/dujl/p/16540765.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。