什么是动态代理?它和静态代理有什么区别?

1、典型回答

动态代理(Dynamic Proxy)是一种在运行时动态生成代理对象的技术。它可以在不修改原始类的情况下,对原始类的方法进行拦截和增强

使用动态代理可以实现以下常用功能:

  1. AOP(面向切面编程):动态代理可以用于实现横切逻辑,例如日志记录、性能监控、事务管理等。通过在方法执行前后插入代理逻辑,可以实现对目标方法的增强
  2. 远程方法调用(RPC):动态代理可以用于远程方法调用框架,例如使用代理对象作为客户端的远程服务代理,将调用转发给实际的远程服务
  3. 动态权限校验:动态代理可以用于动态权限校验,例如在访问某个受限资源时,使用代理对象判断用户是否具有相应的权限。

注:例如,Spring 中的 AOP、声明式事务、MyBatis/MyBatis Plus 中的分页插件、Dubbo、Openfeign 都是动态代理的典型使用场景

动态代理 VS 静态代理

动态代理和静态代理的最大的区别是:静态代理是编译期确定的代理类,但是动态代理却是运行期确定的代理类,也就是说:

  • 静态代理其实就是事先写好代理类,可以手工编写也可以使用工具生成,但它的缺点是每个业务类都要对应一个代理类,特别不灵活,也不方便
  • 动态代理是指在程序运行期,动态地创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术

所以,动态代理和静态代理的效果都是一样的,但静态代理使用麻烦,而动态代理使用简单,后者也是现在编程中实现代理的主流方式

2、全面剖析

静态代理和动态代理的作用都是一样的,都是用于代理原对象,对原对象进行拦截和更多功能增强的,但静态代理的实现比较麻烦,需要事先写好代理类,并且为每个代理对象都事先写好代理类,所以比较麻烦,且维护性较差,而动态代理是一种在运行时动态生成代理对象的技术,它可以在不修改原始类的情况下,对原始类的方法进行拦截和增强,所以它也是程序中都使用的代理技术。

为了让大家更好地理解它们的区别,这里实现一个静态代理的示例给大家看下,具体实现如下:

 在以上示例代码中,UserService 接口和 UserServicelmpl 类是被代理对象和实现类,UserServiceProxy 类是代理类,它实现了 UserService 接口,并在 save 方法中添加了额外的前置和后置逻辑。在静态代理中,手动创建了代理对象,将实际的业务调用委托给被代理对象执行。

动态代理的实现代码如下:

从上述代码可以看出,在Java 语言中,只需要实现 InvocationHandler 接口,并重写 invoke 方法就可以来实现动态代理了。并且动态代理是通用的,和业务代理对象(原对象)没有任何关联,所以写好一次的动态代理,可以代理所有对象,而不需要像静态代理那样,要给每个业务 (代理)方法都写代理代码。

3、知识扩展

JDK动态代理的底层实现主要依赖于 Java 的反射机制实现的

Java 的反射机制允许程序在运行时动态地获取类的信息(如成员变量、方法、构造函数等),并在运行时调用对象的方法或创建对象,如下源码所示:

但是,动态代理除了可以依靠反射机制实现之外,还可以使用字节码生成库来实现动态代理。字节码生成库允许我们在运行时生成字节码,从而创建动态代理对象。例如 CGLib,CGLib 是一个开源的字节码生成库,它可以在运行时扩展 Java 类并生成子类,从而实现动态代理的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/453421.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海南众乐科技--元宇宙场景星球乐园与上海普思签署战略投资协议

3月12日,上海普思投资有限公司与海南众乐科技有限公司正式签署了战略合作协议,上海普思投资有限公司首期投资180万元资金支持推动元宇宙场景项目星球乐园的开发。双方本着互利共赢的原则、达成长期、全面性的战略合作关系,推动数字场景业务共同发展。 星球乐园是海南众乐科技有…

腾讯云轻量应用服务器地域如何选择?

腾讯云轻量应用服务器地域如何选择?地域就近选择,北方选北京地域、南方选广州地域,华东地区选上海地域。广州上海北京地域有什么区别?哪个好?区别就是城市地理位置不同,其他的差不多,不区分好坏…

I2C学习总结

i2c概述 I2C(Inter-Intergreted Circuit) 是一种串行通信协议,用于集成电路之间完成数据传输,i2c用广泛用以各种领域,包括电子设备、嵌入式系统、工业自动化等; i2c仅仅只是一个数据传输的协议&#xff0c…

深耕大屏营销领域的酷开科技,为品牌方带来更多的收益

互联网作为一种新的发展趋势,更是为我们提供了无数的机会和无限可能性,从电子商务时代到社交网络时代,价值文化也成为了品牌与消费者之间紧密联系的关键纽带。而在此背景下,OTT大屏拥有着独特的优势,作为OTT行业内的独…

RPC通信原理(二)

RPC序列化 任何一种序列化框架,核心思想就是设计一种序列化协议,将对象的类型、属性类型、属性值一一按照固定的格式写到二进制字节流中来完成序列化,再按照固定的格式把数据一一读取出来,通过这些数据信息创建出一个新的对象&…

数据结构-链表(一)

一、链表简介 链表(Linked List)是一种常见的数据结构,用于存储和组织数据。与数组不同,链表的元素(节点)在内存中不必连续存储,而是通过指针链接在一起。 链表由多个节点组成,每个…

基于最小二乘递推算法的系统参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于最小二乘递推算法的系统参数辨识。对系统的参数a1,b1,a2,b2分别进行估计,计算估计误差以及估计收敛曲线&#…

Mock.js 基本语法与应用笔记

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

SingleSpa微前端基本使用以及原理

先说说singleSpa的缺点 不够灵活 不能动态加载css文件css不隔离没有js沙箱的机制 ( 没有全局对象 每次切换的应用 都是同一个window ) 但是刚刚接触微前端 可以了解一下微前端的基础使用 qiankun微前端框架已经很成熟 也是基于singleSpa来实现的 点击跳转qiankun的基础使用 大…

【Vuforia+Unity】一个简单AR识别图像弹出按钮播放暂停视频

场景搭建 2.按钮播放视频这部分写一个按钮回调函数即可 3.控制视频的代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Video;public class videomanager : MonoBehaviour {// 这个脚本实现按钮控制VIDEO播放GameO…

snakeflow的springboot项目

Gitee搜索“liuxz/snakerflow”,它是spring boot集成了一款国产工作流引擎snakerflow。 下面是安装步骤: 创建数据库snaker-web,字符集设置成utf8mb4和utf8mb4_generic。不然的话,中文插入不进去。 运行sql命令 CREATE TABLE …

算法刷题day29:区间合并

目录 引言概念一、挤牛奶二、区间合并三、校门外的树四、管道 引言 区间合并这种题,是比较小的题,一般是不会直接出成一道题来考你的,一般思路都是给一道题,里面包含了各种的点,每一个点都需要一个想区间合并这样的知…

【代表作神刊】经管社科类,稀缺SSCI2区期刊,仅14天见刊,2天检索!!

2024年3月第二周,我处EA-ISET协会推荐发表的文章目前都在有序进行中, 新增检索5篇,SSCI5篇; 新增见刊10篇,SSCI1篇,CNKI5篇,谷歌普刊4篇; 现整理部分录用案例,时间节点…

新书速览|机器学习实战:视频教学版

掌握线性回归、分类、数据降维、聚类、关联规则、协同过滤算法及应用 本书内容 《机器学习实战:视频教学版》基于Python语言详细讲解机器学习算法及其应用,用于读者快速入门机器学习。本书配套示例源代码、PPT课件、教学视频、教学大纲、习题与答案、作者…

Voip测试工具

SIPp是一个测试SIP协议性能的工具软件。这是一个GPL的开放源码软件。 sipp是安装在linux机器上的 SIPp可以用来测试许多真实的SIP设备,如SIP代理,B2BUAs,SIP媒体服务器,SIP/x网关,SIP PBX,等等,它也可以模…

for、while、do...while循环的使用

本篇文章只记录for、while、do...while循环的使用&#xff0c;由于java循环较为简单&#xff0c;所以直接上代码。 1、for循环 需求&#xff1a;循环遍历求和 1-100。 public class Demo {public static void main(String[] args) {int sum 0;for (int i 1; i < 100; i…

技术驱动校园招聘:Java+SpringBoot+Vue的实践之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Linux——线程(2)

在上一篇博客中我介绍了Linux中的线程是什么样的&#xff0c;就如同进程可以通过 fork创建&#xff0c;可以被终止&#xff0c;可以退出一样&#xff0c;线程也可以被我们用户控制&#xff0c;这 篇博客我会介绍线程的控制&#xff0c;并且基于线程的控制所产生的一些问题进行 …

麒麟信安集控云工作站解决方案,驱动电网奔向数字化转型新未来!

集控站是电网运行信息的集中监控中心&#xff0c;实现对电网设备状态感知、缺陷发现、主动预警、风险管控和应急处置的全流程闭环管控&#xff0c;在保障日常供电方面发挥重要作用。此前集控站主要采用网络KVM矩阵&#xff0c;其数字化转型面临延长距离受限、无法实现跨辖区延伸…

Redis及其常用命令(二)

SortedSet类型 在此类型中&#xff0c;每个元素都有一个分数 key -> string value -> sorted([socre,member],[score,member]...) # 添加元素 zadd key score member # 遍历集合 zrange key start stop [withscores] #升序 zrevrange key start stop [withscores]#降序…
最新文章