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 代理,是为了提供更灵活的代理选择,以适应不同的使用场景:

  1. 兼容性:由于 JDK 动态代理只能代理接口,如果应用中的组件没有实现接口,Spring AOP 就会自动退回到 CGLIB 代理。
  2. 性能:虽然 CGLIB 在某些情况下可以提供更好的性能,但它需要额外的库依赖,并且在某些特定环境下可能会有兼容性问题。因此,Spring AOP 提供了选择,让开发者可以根据具体需求决定使用哪种代理方式。
  3. 透明性:Spring AOP 的目标是尽可能地对业务代码透明,不强制要求业务对象必须实现接口,这样可以减少对现有代码的侵入性。
  4. 易用性:Spring AOP 的默认策略是如果目标对象实现了接口,就使用 JDK 动态代理;如果没有实现接口,就使用 CGLIB。这样,开发者通常不需要关心底层使用的是哪种代理方式,Spring 会根据情况自动选择。

综上所述,Spring AOP 采用这两种代理方式,是为了提供更多的灵活性和适应性,让开发者可以便捷地在不同场景下应用 AOP,而不需要担心代理的具体实现细节。

spring--JDK动态代理和CGLIB代理的区别的更多相关文章

  1. JDK动态代理和CGLIB代理的区别

    一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...

  2. 动态代理:JDK动态代理和CGLIB代理的区别

    代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法.实际执行的是被代理类的方法. 而AOP,是通过动态代理实现的. 一.简单来说: JD ...

  3. 设计模式---JDK动态代理和CGLIB代理

    Cglig代理设计模式 /*测试类*/ package cglibProxy; import org.junit.Test; public class TestCglib { @Test public ...

  4. JDK动态代理和 CGLIB 代理

    JDK动态代理和 CGLIB 代理 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期期间创建一个接口的实现类来完成对目标对象的代理. 代码示例 接口 public interface ...

  5. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  6. JDK动态代理和cglib代理详解

    JDK动态代理 先做一下简单的描述,通过代理之后返回的对象已并非原类所new出来的对象,而是代理对象.JDK的动态代理是基于接口的,也就是说,被代理类必须实现一个或多个接口.主要原因是JDK的代理原理 ...

  7. JDK动态代理和cglib代理

    写一个简单的测试用例,Pig实现了Shout接口 public class MyInvocation implements InvocationHandler { Object k; public M ...

  8. SpringAOP-JDK 动态代理和 CGLIB 代理

    在 Spring 中 AOP 代理使用 JDK 动态代理和 CGLIB 代理来实现,默认如果目标对象是接口,则使用 JDK 动态代理,否则使用 CGLIB 来生成代理类. 1.JDK 动态代理 那么接 ...

  9. 静态代理、动态代理和cglib代理

    转:https://www.cnblogs.com/cenyu/p/6289209.html 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处 ...

  10. 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。

    基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...

随机推荐

  1. Bert-vits2-2.3-Final,Bert-vits2最终版一键整合包(复刻生化危机艾达王)

    近日,Bert-vits2发布了最新的版本2.3-final,意为最终版,修复了一些已知的bug,添加基于 WavLM 的 Discriminator(来源于 StyleTTS2),令人意外的是,因情 ...

  2. pytest框架学习-前置和后置setup和teardown

    前置和后置 (1)setup和teardown,方法级 写在类中 方法级,每个用例都会执行setup和teardown. 相当于setup_method和teardown_method (2)setu ...

  3. 使用gradle的方式进行Springboot3的web开发(微服务版)

    简要: 最近看了很多的Springboot3的项目,但是发现很多都是用maven来进行版本管理的,很少有用gradle来管理的,通过网上查找资料,看视频,终于自己写一个gradle管理的Springb ...

  4. CVE-2022-39197 复现

    CVE-2022-39197 ️漏洞介绍 Cobalt Strike (CS) 是一个为对手模拟和红队行动而设计的平台,相当于增强版的Armitage,早期以Metasploit为基础框架,3.0版本 ...

  5. mysql的CRUD操作实现

      插入语句(INSERT):一旦我们选择了要插入的字段,   我们就必须保证要插入的数值和选择的字段的个数,顺序,类型一致. 1:怎么插入一条数据: INSERT INTO 插入的表名称(列名1,列 ...

  6. JavaFx之从controller关闭stage(十八)

    JavaFx之从controller关闭stage(十八) 开发时,我们需要从controller的button时间中关闭当前,那么你的按钮事件可以这样: @FXML public Button ca ...

  7. ElasticSearch系列:基本操作(SpringDataElasticSearch)

    一.创建工程.导入坐标 1.选择Next 2.填写名称.选择位置.填写公司或组织.选择Finish 3.导入坐标 <?xml version="1.0" encoding=& ...

  8. 增长黑客招聘条件 JD

    HubSpot招聘T型营销人员加入我们的营销团队.担任此职务后,您将成为第二个致力于HubSpot正在构建的新产品的营销人员.由于其高度机密,我们无法告诉您该产品是什么. 我们正在寻找符合以下条件的人 ...

  9. HBuilderX获取iOS证书的打包步骤

    简介: 目前app开发,很多企业都用H5框架来开发,而uniapp又是这些h5框架里面最成熟的,因此hbuilderx就成为了开发者的首选.然而,打包APP是需要证书的,那么这个证书又是如何获得呢? ...

  10. Hugging Face: 代码生成模型的预训练和微调

    和大家分享我们的机器学习工程师 Loubna Ben Allal 在 10 月上海 KubeCon 大会的主题演讲 题目是: 代码生成模型的预训练和微调 演讲介绍了构建和训练大型代码模型比如: Sta ...