spring--JDK动态代理和CGLIB代理的区别
JDK 动态代理和 CGLIB 代理是 Java 中常用的两种动态代理实现方式,它们各有特点和适用场景:
JDK 动态代理:
- JDK 动态代理是基于接口的代理方式,它使用 Java 反射机制来创建代理对象,并要求目标对象实现一个或多个接口。
- 在代理过程中,JDK 动态代理会创建一个实现了目标对象所有接口的代理类,并在调用时通过
InvocationHandler来处理。 - JDK 动态代理的优点是它是 Java 原生支持的,不需要额外的库,而且与 Java 接口紧密集成。
- 缺点是它只能代理实现了接口的类。
CGLIB 代理:
- CGLIB(Code Generation Library)是一个第三方代码生成库,它通过继承目标类来创建子类,并在运行时动态生成被代理对象的子类。
- CGLIB 代理不需要目标对象实现任何接口,因此它适用于为没有实现接口的类创建代理。
- CGLIB 通常会比 JDK 动态代理更快,因为它使用了更复杂的字节码生成技术来优化运行时性能。
- 缺点是不能对声明为
final的类或方法进行代理,因为这会阻止继承和方法覆写。
Spring AOP 为什么会采用这两种方式?
Spring AOP 选择同时支持 JDK 动态代理和 CGLIB 代理,是为了提供更灵活的代理选择,以适应不同的使用场景:
- 兼容性:由于 JDK 动态代理只能代理接口,如果应用中的组件没有实现接口,Spring AOP 就会自动退回到 CGLIB 代理。
- 性能:虽然 CGLIB 在某些情况下可以提供更好的性能,但它需要额外的库依赖,并且在某些特定环境下可能会有兼容性问题。因此,Spring AOP 提供了选择,让开发者可以根据具体需求决定使用哪种代理方式。
- 透明性:Spring AOP 的目标是尽可能地对业务代码透明,不强制要求业务对象必须实现接口,这样可以减少对现有代码的侵入性。
- 易用性:Spring AOP 的默认策略是如果目标对象实现了接口,就使用 JDK 动态代理;如果没有实现接口,就使用 CGLIB。这样,开发者通常不需要关心底层使用的是哪种代理方式,Spring 会根据情况自动选择。
综上所述,Spring AOP 采用这两种代理方式,是为了提供更多的灵活性和适应性,让开发者可以便捷地在不同场景下应用 AOP,而不需要担心代理的具体实现细节。
spring--JDK动态代理和CGLIB代理的区别的更多相关文章
- JDK动态代理和CGLIB代理的区别
一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...
- 动态代理:JDK动态代理和CGLIB代理的区别
代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法.实际执行的是被代理类的方法. 而AOP,是通过动态代理实现的. 一.简单来说: JD ...
- 设计模式---JDK动态代理和CGLIB代理
Cglig代理设计模式 /*测试类*/ package cglibProxy; import org.junit.Test; public class TestCglib { @Test public ...
- JDK动态代理和 CGLIB 代理
JDK动态代理和 CGLIB 代理 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期期间创建一个接口的实现类来完成对目标对象的代理. 代码示例 接口 public interface ...
- 基于Spring AOP的JDK动态代理和CGLIB代理
一.AOP的概念 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...
- JDK动态代理和cglib代理详解
JDK动态代理 先做一下简单的描述,通过代理之后返回的对象已并非原类所new出来的对象,而是代理对象.JDK的动态代理是基于接口的,也就是说,被代理类必须实现一个或多个接口.主要原因是JDK的代理原理 ...
- JDK动态代理和cglib代理
写一个简单的测试用例,Pig实现了Shout接口 public class MyInvocation implements InvocationHandler { Object k; public M ...
- SpringAOP-JDK 动态代理和 CGLIB 代理
在 Spring 中 AOP 代理使用 JDK 动态代理和 CGLIB 代理来实现,默认如果目标对象是接口,则使用 JDK 动态代理,否则使用 CGLIB 来生成代理类. 1.JDK 动态代理 那么接 ...
- 静态代理、动态代理和cglib代理
转:https://www.cnblogs.com/cenyu/p/6289209.html 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处 ...
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...
随机推荐
- 87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验
瞬间爆火的Mixtral 8x7B 大家好,我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了,火爆程度压过Google的Gemini. 缘起是MistralAI ...
- 安装华企盾DSC防泄密系统huawei Intel的电脑,加载驱动失败
解决方法:从控制面板-[启用或关闭Windows功能]里面把[Hyper-V的功能]关闭 重启电脑再开启之后可以加密驱动则可以加载成功
- Rust实现线段树和懒标记
参考各家代码,用Rust实现了线段树和懒标记. 由于使用了泛型,很多操作都要用闭包自定义实现. 看代码. // 线段树定义 pub struct SegmentTree<T: Clone> ...
- shell的变量
变量含义 学生时代所学的数学方程式,如x=1,y=2,那会称之为x,y是未知数 对于计算机角度,x=1,y=2等于定义了两个变量,名字分别是x,y,且赋值了1和2 变量是暂时存储数据的地方,变量临时存 ...
- 直击云栖|践行数据化运维,云掣重新解读MSP
2020年云栖大会百城汇·杭州站,云掣MSP专场圆满落幕! 本次云栖大会·云掣MSP专场以"数据智能,智能运维"为主题,主要聚焦企业云化转型演进趋势,云上运维全景监控以及云原生云环 ...
- Unix IPC
本文主要是摘抄 APUE 中 IPC 部分的内容 IPC(Inter Process Communication)进程间通信,是指在进程之间进行通信的一种方式,本文将简要介绍一下在 Unix 中存在的 ...
- 文心一言 VS 讯飞星火 VS chatgpt (54)-- 算法导论6.2 6题
文心一言 VS 讯飞星火 VS chatgpt (53)-- 算法导论6.2 5题 六.证明:对一个大小为 n的堆,MAX-HEAPIFY 的最坏情况运行时间为 Ω(Ign).(提示对于n个结点的堆, ...
- 21、Scaffold属性 FloatingActionButton实现类似闲鱼App底 部导航凸起按钮
FloatingActionButton详解 FloatingActionButton简称FAB ,可以实现浮动按钮,也可以实现类似闲鱼app的底部凸起导航 实现类似闲鱼App底部导航凸起按钮 c ...
- 一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效
华丽炫酷的动画特效总能够让人心旷神怡,不能自已.艳羡之余,如果还能够探究其华丽外表下的实现逻辑,那就是百尺竿头,更上一步了.本次我们使用图片.SCSS样式以及SVG图片动画来实现"点赞&qu ...
- Python图像处理丨图像的灰度线性变换
摘要:本文主要讲解灰度线性变换. 本文分享自华为云社区<[Python图像处理] 十五.图像的灰度线性变换>,作者:eastmount. 一.图像灰度线性变换原理 图像的灰度线性变换是通过 ...