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 ...
随机推荐
- 从零玩转Nginx-从零玩转nginx
title: 从零玩转Nginx date: 2023-05-13 23:08:49.074 updated: 2023-05-13 23:17:26.474 url: https://www.yby ...
- 春秋云镜 - CVE-2022-29464
WSO2文件上传漏洞(CVE-2022-29464)是Orange Tsai发现的WSO2上的严重漏洞.该漏洞是一种未经身份验证的无限制任意文件上传,允许未经身份验证的攻击者通过上传恶意JSP文件在W ...
- fence的使用
一.创建一个集群及pcs安装 1.真机切换root用户下 2.打开PC管理器视图 1.安装pcs,关掉防火墙,重启pcs和下次开机自动启动pcs 1.创建一个集群,用户:hacluster:密码:re ...
- CSS3学习笔记-句子排版效果
CSS3提供了丰富的排版效果,可以通过样式属性来控制文本的排列方式.字体样式.行高.字间距等.以下是一些常用的句子排版效果示例: 文本对齐方式: .text-center { text-align: ...
- CIDR技术划分和计算
CIDR:无类域间路由 由于早期的IP地址的划分会浪费太多的IP地址,所以,现在都是用CIDR表示法,为此引入了子网掩码的概念,即网络位的个数可以任意指定.该方法兼容早期的IP划分方法. CIDR表示 ...
- Java 在PDF中添加文本水印、图片水印(基于Spire.Cloud.SDK for Java)
Spire.Cloud.SDK for Java提供了接口pdfWartermarkApi可用于添加文本水印addTextWartermark()和图片水印addImageWartermark()到P ...
- 详解NLP和时序预测的相似性【附赠AAAI21最佳论文INFORMER的详细解析】
摘要:本文主要分析自然语言处理和时序预测的相似性,并介绍Informer的创新点. 前言 时序预测模型无外乎RNN(LSTM, GRU)以及现在非常火的Transformer.这些时序神经网络模型的主 ...
- MindSpore:不用摘口罩也知道你是谁
[本期推荐专题]从三大主流前端技术出发,看看它们各自特性,以及如何从业务特性出发,选择合适的框架. 摘要:我们基于MindSpore设计了一种人脸识别算法,以解决口罩遮挡场景下的人脸识别问题.该算法的 ...
- 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步
摘要:本文通过分析鸿蒙轻内核事件模块的源码,深入掌握事件的使用. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十二 事件Event>,原文作者:zhushy . 事件(Event)是一 ...
- 教你用Java7的Fork/Join框架开发高并发程序
摘要:Fork/Join框架位于J.U.C(java.util.concurrent)中,是Java7中提供的用于执行并行任务的框架,其可以将大任务分割成若干个小任务,最终汇总每个小任务的结果后得到最 ...