设计模式——代理模式12

代理模式给某对象提供一个代理对象,由代理对象来控制对原对象的引用。该模式经常出现在系统框架或相关组件中,如Spring框架如何解决循环依赖,在Mybatis 定义 Dao 层相关接口 不写实现 如何通过注解或者xml映射到对应到sql语句。下面介绍 静态代理和动态代理(JDK ,cglib代理)
设计模式,一定要敲代码理解

静态代理

在这里插入图片描述

被代理实体抽象

public interface Isend {void toSend();
}

被代理实体实现

public class Send implements Isend {@Overridepublic void toSend() {System.out.println("送快递中");}
}

静态代理类

/*** @author ggbond* @date 2024年04月09日 15:24* 静态代理 类*/
public class staticProxy implements Isend{private Isend send;public staticProxy(Isend send) {this.send = send;}//方法增强@Overridepublic void toSend() {before();send.toSend();after();}public  void  before(){System.out.println("代理人员即将进行配送");}public  void  after(){System.out.println("代理人完成配送");}
}

测试与结果

public class Main {public static void main(String[] args) {Isend s1=new Send();s1.toSend();System.out.println("----------");Isend proxy=new staticProxy(s1);proxy.toSend();}
}
送快递中
----------
代理人员即将进行配送
送快递中
代理人完成配送

动态代理

在这里插入图片描述

JDK 代理

核心 实现 InvocationHandler 接口 ,通过反射实现代理

/*** @author ggbond* @date 2024年04月09日 15:35* JDK代理*/
public class myIvocationhandler  implements InvocationHandler {private   Object target;public myIvocationhandler(Object target) {this.target = target;}public  void  before(){System.out.println("JDK代理人员即将进行配送");}public  void  after(){System.out.println("JDK代理人完成配送");}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object object;if ("toSend".equals(method.getName())){ //反射拦截注入before();object = method.invoke(target, args);after();}else {object = method.invoke(target, args);}return  object;}
}

cjlib 代理

cglib 代理 ,需导入 cglib.jar, ASM.jar包
核心 实现MethodInterceptor 接口,与上述写法类似。

public class myInterceptor  implements MethodInterceptor {private   Object target;public myInterceptor(Object target) {this.target = target;}public  void  before(){System.out.println("cglib代理人员即将进行配送");}public  void  after(){System.out.println("cglib代理人完成配送");}@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {Object object;if ("toSend".equals(method.getName())){ //反射拦截注入before();object = method.invoke(target, objects);after();}else {object = method.invoke(target, objects);}return  object;}
}

测试与结果

/*** @author ggbond* @date 2024年04月09日 16:00*/
public class Main {public static void main(String[] args) {Isend s1= new Send();s1.toSend();System.out.println("-----------");//JDK proxy 基于接口 代理Isend JDKproxy=(Isend) Proxy.newProxyInstance(s1.getClass().getClassLoader(),s1.getClass().getInterfaces(),new myIvocationhandler(s1));JDKproxy.toSend();System.out.println("-----------");//cjlib proxy  继承代理Send s2 = new Send();Enhancer enhancer=new Enhancer();enhancer.setCallback(new myInterceptor(s2));enhancer.setSuperclass(s2.getClass());Send cglibproxy =(Send) enhancer.create();cglibproxy.toSend();}
}
送快递中
-----------
JDK代理人员即将进行配送
送快递中
JDK代理人完成配送
-----------
cglib代理人员即将进行配送
送快递中
cglib代理人完成配送

总结

静态代理 需对代理目标进行”量身定制“,当目标新加方法时,代理类也要对应加实现。不利于扩展。
动态代理 :这里介绍 基于接口实现的JDK代理与cglib代理(继承代理)

  1. 代理对象的生成方式:JDK代理是基于接口的代理,要求目标对象必须实现一个接口,代理类会实现同样的接口,并在其中调用目标对象的方法。而CGLIB代理则能够代理没有实现接口的类,通过继承目标类生成子类的方式来创建代理对象。
  2. 底层实现技术:JDK代理主要基于反射机制,通过InvocationHandler接口来定义代理类的行为。在代理对象的方法被调用时,会触发InvocationHandler接口的invoke()方法。而CGLIB代理则使用底层的字节码技术,通过Enhancer类和MethodInterceptor接口来创建代理对象,工作通过字节码增强技术完成。
  3. 性能差异:JDK代理由于基于反射机制,因此在调用代理方法时性能上可能不如CGLIB代理。而CGLIB代理通常被认为性能更好,因为它通过直接操作字节码生成新的类,避免了使用反射的开销。
    使用场景:JDK代理适用于接口驱动的代理场景,当不涉及具体类,只关心接口定义时非常适用。而CGLIB代理则在需要代理没有实现接口的类,或者需要通过继承来提供增强功能的场景更适用。
  4. 依赖问题:JDK代理不需要添加任何额外依赖,因为它是基于JDK自带的API。而CGLIB代理则需要添加CGLIB库的依赖。

代码下载

代码下载

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再见 MybatisPlus,阿里推出新 ORM 框架更牛X

最近看到一个 ORM 框架 Fluent Mybatis 挺有意思的,整个设计理念非常符合工程师思维。 我对官方文档的部分内容进行了简单整理,通过这篇文章带你看看这个新晋 ORM 框架。 官方文档:https://gitee.com/fluent-mybatis/fluent-mybatis/wikis 提…

Nginx反向代理与Tomcat实现ssm项目前后端分离部署

Nginx nginx是一款http和支持反向代理的web服务器,以其优越的性能被广泛使用。以下是百度百科的介绍。 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.…

智慧园区水电能源监控管理系统

随着智慧城市的快速发展,智慧园区作为城市智能化的重要组成部分,其能源监控管理系统显得尤为关键。智慧园区水电能源监控管理系统,是利用先进的信息技术和自动控制技术,对园区内的水电能源使用进行实时监控、管理和优化的综合性智…

美国34401A安捷伦数字万用表

181/2461/8938产品概述: 附加功能: 6 1/2位数分辨率10种测量功能:DC/交流电压、DC/交流电流、2线和4线电阻、二极管、连续性、频率、周期基本精度:0.0035% DC,0.06%交流1000 V最大电压输入,3 A最大电流输入每秒1000次读数512读取记忆 安捷…

Linux C++ 027-STL之deque容器

Linux C 027-STL之deque容器 本节关键字:Linux、C、deque 相关库函数:pubsh_back、begin、front、sort deque基本概念 功能:双端数组,可以对头端进行插入删除操作。 deque 与 vector 的区别: (1&#x…

vue将html生成pdf并分页

jspdf html2canvas 此方案有很多的css兼容问题,比如虚线边框、svg、页数多了内容显示不全、部分浏览器兼容问题,光是解决这些问题就耗费了我不少岁月和精力 后面了解到新的技术方案: jspdf html-to-image npm install --save html-to-i…

关于pandas 无法读取 csv 文件数据的解决方式

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 …

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量 在电气化铁路运输中,受电弓滑板的健康状况对于保障列车安全行驶至关重要。受电弓滑板作为连接电网与列车的直接介质,其磨损情况直接影响到电能的有效传输及列车的稳定运行。精确、快速测量受电弓滑板磨损情…

IntelliJ IDEA 2024.1安装与激活[破解]

一:IDEA官方下载 ①如题,先到IDEA官方下载,简简单单 ②IDEA官方:IntelliJ IDEA – the Leading Java and Kotlin IDE 二:获取脚本 🌟网盘下载:jetbra (密码:lzh7) 🌟获取…

CLI的使用与IOS基本命令

1、实验目的 通过本实验可以掌握: CLI的各种工作模式个CLI各种编辑命令“?” 和【Tab】键使用方法IOS基本命令网络设备访问限制查看设备的相关信息 2、实验拓扑 CLI的使用与IOS基本命令使用拓扑如下图所示。 3、实验步骤 (1)CLI模式的切…

Visual Studio Code 终端为管理员权限

第一部 1、 Visual Studio Code 快捷方式启动选项加上管理员启动 第二步 管理员方式运行 powershell Windows 10的任务栏自带了搜索。或者开始菜单选搜索只需在搜索框中输入powershell。 在出来的搜索结果中右击Windows PowerShell,然后选择以管理员方式运行。 执…

使用Docker Registry-v2搭建镜像仓库详细教程

我们使用docker来部署私有化镜像仓库… 1、下载 registry:v2 镜像 docker pull registry:22、在私有仓库所在的主机目录新建一个文件夹,用于持久化保存仓库中的镜像 mkdir -p /opt/registry3、启动registry镜像 使用docker镜像启动私有仓库容器服务,…

ArcGIS Desktop使用入门(四)工具箱——属性域

系列文章目录 ArcGIS Desktop使用入门(一)软件初认识 ArcGIS Desktop使用入门(二)常用工具条——标准工具 ArcGIS Desktop使用入门(二)常用工具条——编辑器 ArcGIS Desktop使用入门(二&#x…

nacos服务治理

nacos 服务演变之路 单体架构 集群级垂直化 SOA 微服务 微服务优缺点 SOA与微服务区别 springcloud技术栈 服务发现概念 服务发现两种方式–客户端服务发现 服务发现两种方式–服务端发现 服务发现技术对比 nacos架构图 nacos实战 服务发现 源码解析 nacos实现了springcloud…

网络安全---RSA公钥加密与签名

实验项目:RSA公钥加密与签名实验 1.实验目的 本实验的学习目标是让学生获得 RSA 算法的动手经验。 通过课堂学习,学生应该已经了解 RSA 算法的理论部分, 知道在数学上如何生成公钥、私钥以及如何执行加密、解密和签名生成、验证。 通过使用…

Docker容器嵌入式开发:Docker Ubuntu18.04配置mysql数据库

在 Ubuntu 18.04 操作系统中安装 MySQL 数据库的过程。下面是安装过程的详细描述: 首先,使用以下命令安装 MySQL 服务器: sudo apt install mysql-server系统会提示是否继续安装,按下 Y 键确认。 安装过程中,系统会下载并安装 MySQL 相关的软件包,包括 libaio1、mysql…

STM32+ESP8266水墨屏天气时钟:文字取模和图片取模教程

项目背景 本次的水墨屏幕项目需要显示一些图片和文字,所以需要对图片和文字进行取模。 取模步骤 1.打开取模软件 2.选择图形模式 3.设置字模选项 注意:本次项目采用的是水墨屏,并且是局部刷新的代码,所以设置字模选项可能有点…

实验3 交换机基本配置

实验3 交换机基本配置 一、 原理描述二、 实验目的三、 实验内容四、实验步骤1.建立实验拓扑2.设备编址3.检测链路连通性4.交换机双工模式配置 一、 原理描述 交换机(Switch)也称为交换式集线器,其工作在OSI 第二层(数据链路层)上…

Windows摄像头推流-RTSP

0.背景: 调试rtsp视频流时,没有网络摄像头怎么办,只需要在同一个局域网下,用windows推送rtsp流,就可以在linux进行接收。 1.下载资源包 资源包链接:https://pan.baidu.com/s/1008I7TKazE4JgFiozhtekg?pw…

【算法深度探索】动态规划之旅(1):挑战OJ题海,解锁15道经典难题,让你成为DP大师!

📃博客主页: 小镇敲码人 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙…