Spring5深入浅出篇:JDK代理与CGLIB代理区别

news/2024/9/20 1:30:20/ 标签: java, 开发语言, spring, 代理模式

Spring5深入浅出篇:JDK代理与CGLIB代理区别

很多粉丝私信我这个Spring5的课程在哪看,这边是在B站免费观看欢迎大家投币支持一下. https://www.bilibili.com/video/BV1hK411Y7zf

JDK动态代理与CGLIB的区别

在Java的世界里,动态代理主要有两种实现方式:JDK动态代理和CGLIB。这两种代理方式各有特点,适用于不同的场景。本文将对JDK动态代理和CGLIB进行详细的比较和分析,帮助读者更好地理解它们之间的区别和适用场景。

JDK动态代理

JDK动态代理是Java自带的一种代理方式,它是在JDK 1.3版本中引入的。JDK动态代理的核心是通过反射技术在运行时动态地创建代理类。

特点

  1. 接口代理:JDK动态代理只能代理接口,不能代理类。这是因为JDK动态代理是通过创建一个接口的实现类来完成代理的,而这个实现类是由JDK在运行时动态创建的。
  2. 方法拦截:JDK动态代理通过InvocationHandler接口的invokeMethod方法来拦截代理对象的方法调用,从而实现方法的增强。
  3. 性能较高:由于JDK动态代理是基于Java反射机制实现的,因此相比于CGLIB,其性能损耗较小。
  4. 使用简单:使用JDK动态代理非常简单,只需要实现InvocationHandler接口和指定代理的接口即可。

适用场景

JDK动态代理适合于那些只需要代理接口方法的场景,特别是当你需要在运行时动态地创建代理对象时,JDK动态代理是一个非常好的选择。

CGLIB

CGLIB(Code Generation Library)是一个强大的高性能代码生成库,它可以实现对类的代理。CGLIB创建的代理对象是通过在运行时创建目标类的子类来完成的。

特点

  1. 类代理:与JDK动态代理不同,CGLIB可以代理类,并且可以代理没有实现接口的类。
  2. 方法覆盖:CGLIB是通过生成目标类的子类来实现代理的,因此它可以覆盖父类的方法。
  3. 性能损耗:CGLIB在创建代理对象时需要生成更多的字节码,因此在性能上可能会比JDK动态代理稍差。
  4. 功能强大:CGLIB提供了更多的功能,如方法覆盖、属性覆盖等。

适用场景

CGLIB适合于那些需要代理类方法的场景,特别是当你需要覆盖目标类的方法或者目标类没有实现接口时,CGLIB是一个很好的选择。

区别

  1. 代理对象的类型:JDK动态代理只能代理接口,而CGLIB可以代理类。
  2. 实现方式:JDK动态代理是通过创建接口的实现类来实现代理,CGLIB是通过创建目标类的子类来实现代理。
  3. 性能:JDK动态代理的性能通常优于CGLIB,因为JDK动态代理基于Java反射机制,而CGLIB需要生成更多的字节码。
  4. 功能:CGLIB提供了更多的功能,如方法覆盖、属性覆盖等,而JDK动态代理主要通过方法拦截来实现功能增强。
  5. 使用难度:JDK动态代理的使用相对简单,而CGLIB的使用稍微复杂一些,需要更多的配置和理解。

spring_45">在spring框架中动态代理的使用

在Spring框架中,动态代理技术被广泛应用于AOP(面向切面编程)的实现。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。Spring根据目标对象和切面的通知类型来决定使用哪种代理技术。

Spring中JDK动态代理的使用

当Spring配置的目标对象实现了至少一个接口时,Spring默认使用JDK动态代理来创建代理。这是因为JDK动态代理是基于接口实现的,它利用了Java的反射机制在运行时动态地创建代理类。使用JDK动态代理,Spring可以方便地为目标对象的方法调用添加前置、后置、环绕等增强处理。

Spring中CGLIB代理的使用

对于没有实现接口的目标对象,Spring将使用CGLIB来创建代理。CGLIB(Code Generation Library)是一个强大的高性能代码生成库,它通过在运行时动态创建目标类的子类来实现代理。与JDK动态代理相比,CGLIB可以代理没有实现接口的类,并且可以覆盖父类的方法。 Spring使用CGLIB代理时,可以为目标类的所有方法提供代理,包括非接口的方法。这使得CGLIB代理在某些情况下比JDK动态代理更加灵活。

如何在Spring中指定代理方式

Spring AOP默认会根据目标对象是否实现了接口来选择使用JDK动态代理或CGLIB代理。但是,你也可以通过配置来显式指定使用哪种代理方式。例如,你可以在Spring的配置文件中设置proxy-target-class属性为true,这样Spring就会强制使用CGLIB代理,即使目标对象实现了接口,默认为false使用JDK代理技术。

<aop:config><aop:proxy proxy-target-class="true" />
</aop:config>

或者在Java配置中:

@EnableAspectJAutoProxy(proxyTargetClass = true)
@Configuration
public class AppConfig {// ...
}

总结

Spring框架中的动态代理技术是实现AOP的关键。根据目标对象和业务需求的不同,Spring灵活地选择使用JDK动态代理或CGLIB代理,以满足不同的代理需求。JDK动态代理适用于接口代理,而CGLIB代理提供了更广泛的类代理能力。开发者可以根据实际情况选择合适的代理方式,以实现代码的解耦和横切关注点的模块化。通过合理利用Spring的AOP功能,可以极大地提高代码的可重用性和维护性。

结论

JDK动态代理和CGLIB都是Java中常用的动态代理技术,它们各有优势和特点。在选择使用哪种代理技术时,应该根据实际的需求和场景来决定。如果只需要代理接口方法,并且对性能有较高要求,那么JDK动态代理是一个不错的选择。而如果需要代理类方法,或者目标类没有实现接口,那么CGLIB将是更好的选择。在实际开发中,根据具体需求灵活选择和使用这两种动态代理技术,可以大大提高代码的灵活性和可维护性。

以上便是本文的全部内容,我是全干程序员demo,每天为你带来最新好用的开发运维工具,如果你觉得用,请点赞,让更多的人了解相关工具

如果你想了解更多关于全干程序员demo,还有更多付费工具免费破解如JB全家桶,可以关注公众号-全干程序员demo,后面文章会首先同步至公众号
在这里插入图片描述


http://www.ppmy.cn/news/1433506.html

相关文章

广州大学《虚拟现实与游戏开发》实验报告一HTC-VR环境搭建与开发

广州大学学生实验报告 开课实验室&#xff1a; 学院 年级、专业、班 姓名 学号 实验课程名称 虚拟现实与游戏开发 成绩 实验项目名称 1. HTC-VR环境搭建与开发 指导老师 实验目的 HTC VIVE硬件安装虚拟现实开发环境搭建 3.熟悉虚拟现实硬件系统和…

springboot-异步、定时、邮件任务

目录 一&#xff0c;前言 二&#xff0c;异步 2.1&#xff0c;案例&#xff1a; 1&#xff0c;首先创建一个service&#xff1a; 2&#xff0c;Controller: ① 想办法告诉spring我们的异步方法是异步的&#xff0c;所以要在方法上添加注解 Async ②去springboot主程序中开…

深入Spring Boot配置机制:如何高效管理应用配置

一、属性的优先级和配置文件的位置 在Spring Boot应用中&#xff0c;我们可以在多个地方定义配置属性&#xff0c;并且Spring Boot提供了一套优先级排序&#xff0c;来决定同一属性多处定义时的覆盖关系。理解这个机制对于配置管理至关重要。 1. 配置文件查找的顺序 Spring …

【debug记录】有gpu,但是 pytorch仍显示 cpu【原来是新电脑没安装cuda】

原来是新电脑没安装cuda&#xff0c;以为安装了pytorch包就可以了。 检查过程&#xff1a; nvcc 不是内部或外部命令&#xff0c;也不是可运行的程序, 说明没有安装cuda。 查看电脑显卡最高支持cuda版本&#xff1a;nvidia-smi 安装cuda&#xff0c;选择版本&#xff1a;ht…

基于小程序实现的查寝打卡系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

flink1.18.0 流转表 表转流 jdk17 attachAsDataStream

目的 流表互转 而且流sink 表sink同时存在且都可以输出. 依赖类 package flink.luca.flinkTableAndSQL.Convert;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@Data @AllArgsConstructor @NoArgsConstructor public class Outer…

gcc/g++ 的使用

————gcc&#xff1a;只能编译c语言 ————g&#xff1a;c和c都可以编译 当然&#xff0c;c语言编译还是推荐gcc。 在学习gcc/g之前&#xff0c;我们要先了解一些知识点&#xff1a; 一、背景知识 1&#xff0c;预处理 gcc -E就是告诉编译器到预处理阶段就停下来&am…

QBoxLayout的addWidget(QWidget * w)会改变w的parent()

示例&#xff1a; 我希望在page_frame对象中使用orders_add_page对象的price变量&#xff0c; 但按照下面这样写得到的price的值都不对。 int price; orders_add_page::orders_add_page(QWidget *parent): QDialog(parent) {ui.setupUi(this);page new page_frame(type, t…

Windows10如何关闭Edge浏览器的Copilot

在Windows10更新后&#xff0c;打开Edge浏览器&#xff0c;无论复制什么内容&#xff0c;都会弹出Copilot人工智能插件&#xff0c;非常令人反感&#xff0c;网上搜索的关闭方法都非常麻烦&#xff0c;比如&#xff1a;组策略和注册表。自己摸索得出最简便有效的关闭方法。 1、…

go语言实现简单登陆样例

目录 1、代码实现样例&#xff1a; 2、postman调用&#xff0c;获取登陆后的token&#xff1a; 1、代码实现样例&#xff1a; package mainimport ("net/http""time""github.com/dgrijalva/jwt-go""github.com/gin-gonic/gin" )var …

【算法】约瑟夫环

文章目录 题目一1.数组模拟1.1出圈顺序递归求出圈顺序 1.2最后出圈人 2.环形链表【DEMO】3.递推求最后出圈人3.13.2 题目二1.数组模拟2.递推求最后出圈人2.12.2 题目一 1-n编号 s开始1-m报数 报到m出圈 求出圈顺序or最后人 1.数组模拟 1.1出圈顺序 递归求出圈顺序 // AC输入…

开源模型应用落地-LangChain高阶-集成vllm-QWen1.5(一)

一、前言 通过langchain框架调用本地模型,使得用户可以直接提出问题或发送指令,而无需担心具体的步骤或流程。vLLM是一个快速且易于使用的LLM推理和服务库。通过两者的结合,可以更好地处理对话,提供更智能、更准确的响应,从而提高对话系统的性能和用户体验。 二、术语 2.…

大语言模型微调过程中的 RLHF 和 RLAIF 有什么区别?

目前想要深入挖掘大型语言模型&#xff08;LLM&#xff09;的全部潜力需要模型与我们人类的目标和偏好保持一致。从而出现了两种方法&#xff1a;来自人类反馈的人力强化学习&#xff08;RLHF&#xff09;和来自人工智能反馈的人工智能驱动的强化学习&#xff08;RLAIF&#xf…

服务器基础知识(2)

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;服务器❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 一、如何选择服务器主机 选择服务器主机时&#xff0c;需要考虑以下几个关键因素&#xff1a; 用途和需…

MYSQL 8.0的Linux - Generic版本安装

1.本文适用范围 适用于MYSQL 8.0的Linux - Generic版本&#xff0c;原则上适用所有的操作系统。已测试的操作系统包括&#xff1a; Ubuntu 16.04Ubuntu 18.04Ubuntu 20.04Ubuntu 22.04Kylin Linux Advanced Server V10 ​ 注意&#xff1a;如果操作系统使用过包管理系统&…

JAVA toString方法详解

hi&#xff0c;我是程序员王也&#xff0c;一个资深Java开发工程师&#xff0c;平时十分热衷于技术副业变现和各种搞钱项目的程序员~&#xff0c;如果你也是&#xff0c;可以一起交流交流。 今天我们来聊聊Java中toString方法~ toString方法的定义 在Java中&#xff0c;toStri…

医院信创FTP要进行替代,有什么值得信赖的方案?

信创产业&#xff0c;即信息技术应用创新产业。其发展核心在于通过行业 应用拉动构建国产化信息技术软硬件底层架构体系和全生命周期生态体系&#xff0c;解决核心技术关键环节“卡脖子”的问题&#xff0c;为中国未来发展奠定坚实的数字基础。 2018 年 以来&#xff0c;受“华…

蓝桥杯2024年第十五届省赛真题-拔河

审题可能会遇到的问题&#xff1a;认为所有人都必须参与拔河&#xff0c;但其实不用&#xff0c;只要符合l1<r1<l2<r2就行&#xff0c;不一定要全部人上场&#xff0c;比如只上场a1和a2他们的力量差是1其实也可以。 正解思路&#xff1a;前缀和枚举二分。枚举左区间&…

MT8788智能模块简介_MTK联发科安卓核心板方案厂商

MT8788安卓核心板是一款具备超高性能和低功耗的4G全网通安卓智能模块。该模块采用联发科AIOT芯片平台&#xff0c;供货周期长。 MT8788核心板搭载了12nm制程的四个Cortex-A73处理器核心和四个Cortex-A53处理器核心&#xff0c;最高主频可达2.0GHz。板载内存容量可选为4GB64GB(也…

如何恢复已删除的微信联系人?

“您好&#xff0c;我删除了微信中的 5 个联系人。微信中已删除的联系人可以恢复吗&#xff1f;我使用的是 iPhone 15。” – 董奇 现在&#xff0c;越来越多的人使用微信应用程序与他人交流。微信中的联系人可能对我们来说非常重要。如果您误删了一些联系人&#xff0c;则必须…