猿来代理模式如此esay~

article/2025/8/18 8:15:20

文章目录

  • 代理
    • 为什么要使用代理
    • 静态代理
    • 动态代理
      • 有了静态代理为什么还要有动态代理
      • JDK动态代理

代理

为什么要使用代理

  1. 简化代码开发,应用场景例如:Spring中的AOP就使用了动态代理的思想,进一步降低了代码的耦合性

  2. 设想这样一个业务需求:现在有5本书为高等数学、线性代数、MySQL是怎么运行的、JAVA并发、图解TCP/IP这5本书,要统计每本书每次被阅读的时间,那么按照框架思想,因为这5本书都属于书类,都需要被阅读,那么可以创建一个Book()抽象类(创建接口统一框架,代理时会发挥作用,这一点很重要),创建一个抽象方法read(),如果编写5个书籍类,分别统计阅读时间,如下图:
    不使用代理

  3. 此时我们会想如果现在有100本书,那么不是得编写100次开始时间和结束时间了?那么此时代理这种设计模式就应运而生了,使我们可以专注编写书中read()的内容(因为每本书的内容不同,所以read()方法中的东西肯定不相同),而将重复的工作交由代理类去做即可,如下图:
    代理模式

  4. 代理的本质是:在不破坏源代码的情况增强其功能,也就是在某个模块上可以不断添加功能而无需改动该模块,降低耦合性,其实我们不单单可以添加开始时间和结束时间,例如我们可以在该类的方法执行前(例如执行read方法前)进行一些配置操作,执行方法完成后(如执行完成read方法后)回收一些资源、关闭IO操作等等,这些操作都是重复的,可以被抽取到方法体外,交由代理类去完成的操作

静态代理

我们可以根据上面内容写出下面的代码,而且我们把在编译阶段就确定代理类的方式称为静态代理

  1. 创建Book抽象类
    Book抽象类

  2. 继承Book抽象类实现其中的MySQL类
    MySQL类

  3. 计算时间
    计算阅读时间

  4. 注意:可能会有读者有疑问为什么要使用抽象类Book:从代码的角度我们可以这样解释,因为要统计各种书籍的阅读时间,因此肯定传入的参数类型是要统一的,即同个抽象类的子类,才能进行传入,这样才能减少代码编写,降低代码耦合性;从逻辑的角度,肯定是对同一类的东西进行统计我们才会去抽取其中重复的代码,将其放在代理类的方法中

动态代理

有了静态代理为什么还要有动态代理

静态代理的缺点:静态代理需要我们在编译阶段就确定代理类和被代理对象,这样其实已经很完美了,但是随着类的种别越来越多(例如需要创建配置和回收资源的代理类、需要创建计算总耗时的代理类),都是不同的类,因此需要创建不同的代理方法,这样就会产生越来越多的代理类,增加代码冗余,此时动态代理就应运而生了!

JDK动态代理

  1. 定义:在运行时动态生成的代理对象,也就是在运行时才去确定要代理的类是什么,例如:统计时间,无论是统计什么类型的时间,需要的是把该类告诉代理类即可,不用考虑该类是什么,从代码的角度也就是去掉了静态代理方法中的参数,这里我习惯把被代理类称为业务类,我们再画个图理解一下:
    动态代理模型

  2. 再重申一下代理(使用于静态和动态代理)的本质是:在不改变源代码的情况下增强其模块功能,那么动态代理则是在静态代理的思想上再进一步,不需要关心该业务类是什么,体现在代码里也就是不用写死代理方法中的参数,直接告诉代理类要被代理类是什么即可

  3. 动态代理在底层是使用反射进行对类中的方法进行调用的(如通过反射调用MySQL类中的read()方法),因为使用反射就可以更加灵活,只需指定类、方法和参数,反射根据条件会自动去找其对应的类中的对应参数方法,而无需写死,这也解释了为什么需要使用反射了

  4. 下面我们通过代码举个例子,这里我们使用了jdk代理模式,其实还有例如cglib的代理模式,以后再把cglib的坑填上~

  5. 演示代码前我们对jdk动态代理进行一些讲解:

    1. jdk动态代理要求被代理类必须实现接口
    2. jdk动态代理使用继承InvocationHandler的类来指定要代理的业务类(也就是被代理对象),在代理方法中通过反射的invoke执行业务方法,而在使用反射调用被代理类方法的前后可以添加一些操作,如调用前配置初始环境,调用后清理数据缓存等,从而增强其被代理类的功能
    3. jdk需要创建代理类,在代理类中传入InvocationHandler和被代理类,传入InvocationHandler是为了在我们调用业务类的方法时,代理类会自动调用invoike方法执行增强后的业务类;而传入被代理类是为了因为动态代理类是在程序运行中生成的,所以需要使用被代理类的类加载器和类接口来加载代理类并且实现该接口方法,然后当调用该方法时,就会跳转到InvocationHandler的invoke方法
    4. 我们可以通过在运行程序中输入该System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true")即可在项目根目录的proxy包下看到生成的代理类,代理类的代理方法如下
      生成的代理类中的代理方法
  6. 代码演示:
    创建动态代理
    实现动态代理
    结果


http://chatgpt.dhexx.cn/article/RIiVT0Sg.shtml

相关文章

名师为何离开猿辅导?

来源|盒饭财经 编辑|谭丽平 有名师正跳下猿辅导这辆高速奔跑的列车。 “猿辅导数学老师邓诚去哪了?”“如何看待邓诚老师离开猿辅导”近期,在知乎上,出现了类似网友提问。 邓诚是一位明星讲师,因“跟着坑神…

猿猿

大家好,刚刚开通博客,欢迎各位多踩踩,以后还有很多学习上的问题还得多多劳烦各位大神指点。

老猿说说-Thread

引导语 从本章开始我们开始学习线程的知识,线程是非常有趣的一个章节,大多数同学对于线程 API,属于不用就忘,到用时需要百度的情况,希望通过本小节的源码阅读,能够加深对线程的印象。 本小节主要三章&…

先进计算成趋势,猿代码助力科学之梦|猿代码科技

计算,是社会发展各个环节都存在的名词,无论是科学研究,或者是生产制造,甚至于每天的睁眼闭眼,只要有思考就会有计算。在全球经济一体化的当下,经济社会对于“计算”的依赖日益凸显,“计算”早已…

猿辅导获国际科研大奖:深度解析它为何在科研界“混得”风生水起

近年来,随着新一代人工智能在全球范围内的蓬勃兴起,人们的生产和生活方式也发生了巨大的变化。人工智能作为引领新一轮科技革命和产业变革的战略性技术之一,正在各领域落地应用。为了进一步推动人工智能与教育深度融合,发挥人工智…

猿来如此java系统_2020年最新 猿来如此springboot基础脚手架(资料完整)

『视频截图』: 98.jpg (78.82 KB, 下载次数: 0) 2020-5-29 10:44 上传 97.jpg (20.2 KB, 下载次数: 0) 2020-5-29 10:43 上传 『课程目录』: 目录:/6、2020年最新 springboot基础脚手架(笔记、源码、素材 完整) ┣━━课堂笔记 ┃ ┗━━springboot基础脚手架课堂…

猿来绘Java-31-为什么子类重写的方法抛出的异常类型小于等于父类被重写的方法抛出的异常

来一个例子 //OverrideTest.java package com.ylaihui.exception;import java.io.FileNotFoundException; import java.io.IOException;public class OverrideTest {public static void main(String[] args) {OverrideTest test new OverrideTest();test.display(new SubClas…

写在 2023 年初的后端社招面试经历(四年经验):字节 米哈游 富途 猿辅导

目录 背景面试准备面试 字节跳动米哈游富途牛牛猿辅导 总结 一些推荐 1. 背景 距离上一次面试[1]已经过去快 3 年了,又碰上 2022 年互联网行业大动荡,很多企业都做出了裁员决定。 身为互联网人要时刻关注自身成长,所以会对 “跟面试官切磋” …

猿人学第一题

** 猿人学系列保姆级教程 ** 第一题* 链接:http://match.yuanrenxue.com/match/1 1 分析所需参数请求来源及获取请求索要参数 上图我们可以分析出我们所需数据请求的url为http://match.yuanrenxue.com/api/match/1?me1c053a7e2130d440b11196035803350%E4%B8%A81608486311…

猿来你也在这里,北京上海无聊猿线下见面会成功举办

由Angry Rabbit暴躁兔社区、男士理容生活潮牌公司dearBOYfriend、REVO联合众多无聊猿NFT玩家举办的无聊猿聚会活动于8月7日下午在北京与上海两地同期正式举行。 本次下线活动在北京的举办地为海淀区荷清路东升园公寓Meta Space咖啡厅,参与者16人,上海举办…

猿创征文|那一年

猿创征文|那一年 那一年,因为游戏我与开发结缘那一年,我选了软件技术专业那一年,我实习了那一年,我去了一家培训外包公司那一年,我大学毕业那一年,我去了济南工作那一年,再就业那一年…

猿创征文 | Python 开发工具进化之旅

​ 前言 我为什么会接触Python? 小元是开发驱动底层的,比驱动还底层,没错就是底层设备内部程序。驱动层以下都是 C 的天下, 我为什么会接触到 Python? 2010 年的时候, 那时候 python 还没火, 那时候我就…

猿人学第1题(一天搞一个)

文章目录 前言 1. 加密方法1.1 加密寻找准备1.1.2 抓包分析1.1.3 调用堆栈前期试验理解中期操作 1.2 加密内容 2. 代码实现2.1 完整版代码2.2 python函数总结2.3 注意 前言 对js的基础一窍不通,最近才开始看。所以本文只是复现,别人的操作的逻辑。 如果…

猿人学 第一题

地址:http://match.yuanrenxue.com/match/1 思路: 1.找到传输加密地址,发现加密字段m,,通过全局搜索没有找到m值 2.通过该地址访问过的js文件排查到request,再通过断电发现m加密地方 3.找到对应的加密方…

JAVA保姆级教学(一)[安装及使用]

一.首先我们常用编写java的是idea和eclipse,在这里呢我们主要讲解的是eclipse,它的安装及配置比较复杂,小伙伴们耐心看完这篇文章,少迷路~ 二.首先,我们去官网自行下载eclipse和jdk,有的人刚接触java可能不会下载,那么…

常用服务和开放端口对照表

常用服务和开放端口对照表 代理服务器常用以下端口: (1). HTTP协议代理服务器常用端口号:80/8080/3128/8081/9080 (2). SOCKS代理协议服务器常用端口号:1080 (3). FTP&am…

常用端口号\协议\服务对照表

转载于:https://blog.51cto.com/networktech/291211

常用端口号与对应服务

1、端口号 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口,如ADSL Modem、集线器、交换机、路由器上用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。逻辑端口是指逻辑意…

HTTP,TCP,UDP常见端口对照表大全

HTTP,TCP,UDP常见端口对照表,下面罗列了包括在Linux 中的服务、守护进程、和程序所使用的最常见的通信端口小贴士:CtrlF 快速查找 Http端口号(点标题可收缩或展开) No1.最常用端口 端口号码/层名称注释1tcpmuxTCP端口服务多路复用5rje远程作…

mysql实现跨服务器查询数据

在日常的开发中经常进行跨数据库进行查询数据。 同服务器下跨数据库进行查询在表前加上数据库名就可以查询到数据。 mysql跨服务器进行查询提供了FEDERATED引擎进行映射表,然后进行查询。 mysql数据库federated引擎是关闭的,首先需要先启用该引擎。my…