代理模式-静态动态代理-jdk动态代理-cglib动态代理

代理模式   静态代理  动态代理:jdk动态代理 cglib动态代理

注意 :下面的代码截图 要配合文字去看 我对代码的每一步都做了解释

所以需要配合图片观看提取吗1111icon-default.png?t=N7T8https://pan.baidu.com/s/1OxQSwbQ--t5Zvmwzjh1T0A?pwd=1111

这里直接把项目文件 及代码  给大家  不收费  可以下载之后对着下面的看  会增强理解


关于 代理模式:

代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介

举例子:

厂家的产品 无法直接卖给客户的时候 就需要中介  将厂家和客户联系起来  同时可以加价提高利润 类似这种就是代理模式

静态代理代码实现:

准备好  接口  接口的实现类【代理类】  目标类【也就是厂家】

建包如下:【自己发挥就行 】

封装学生类

【javabean javabean封装 就不截图了 正常一个Javabean那样去封装即可】

给它设置好空参 有参构造 以及相应的set get方法  还有自己的方法即可

封装老师类:

javabean封装 就不截图了 正常一个Javabean那样去封装即可

这里老师的功能也就是metting会议以及test测试方法  很简单只是打印了参数

  就是自己写的方法 这个做测试用的  自己发挥即可

接口【即老师想让学生代理他的职能】

学生代理【实现接口  拦截请求增强功能】

这个代理类 就是实现了上面的接口  可以帮助teacher类分担职能  。

这里看代码   我们对传入的参数 进行判断 这个就可以理解为功能增强 因为原本的老师类 并没有判断的功能 只有最简单的会见人员  【可以返回看一下老师类 的方法】

测试类:

可以看出来 静态代理的接口与实现类都是 我们用代码写死的,也就是说是固定的,也就是代理类是由程序写好 ,每一个代理代理一个内容,这样就会产生问题,随着代理的东西越来越多,造成资源浪费以及代码冗余


动态代理

“即可以在运行时 根据需要动态的去创建代理类   相对于静态代理的固定写死  它可以动态的根据需要自动创建代理  减少了内存资源浪费以及代码量

动态代理采用反射的机制,在运行时创建一个接口类的实例。可以统一对代码进行增强与管理。


Jdk动态代理

如何利用jdk实现动态代理

                 这里需要了解 Java的反射机制 以及它的jvm虚拟机才能更好的理解下面的内容

这里默认你具备基础  

Jdk动态代理是利用接口 以及无参构造自动的生成代理类

必须准备

接口 以及接口的实现类

以及一个实现类去实现Proxy所需要的InvocationHandel接口

这里的InvocationHandel就是去增强代理的功能以及控制代理的行为

接口:

实现类:

InvocationHandler

这里是对代理的行为进行控制

首先定义了一个object对象  并且通过Invocation的空参构造 注入了object  也就是我们接口的实现类 代理类

InvocationHandler的参数

  1. 指定代理类  也就是注入的那个代理
  2. 在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口【调用方法进行增强】
  3. 包含传入代理实例上方法调用的参数值的对象数组【传入参数】

测试类:

首先拿到接口的实现类 也就是代理类

将代理注入  进行控制

利用Proxy的方法newProxyInstance动态生成一个代理类

NewProxyInstance的参数  第一个参数就是指定类加载器,由谁来加载类

第二个参数就是通过反射拿到类的接口 ,第三个参数 就是我们的代理行为控制 也就是实现了InvoationHandler的控制类

动态生成之后  再向下转体 指向生成的代理类  【由于生成的类是Object类也就是所有类的父类】

就可以调用代理的方法 从而实现动态代理

CGLIB动态代理

这个CGLB动态代理,是一个第三方库【需要导入依赖】,比起jdk动态代理来说,它不在乎是否有代理的接口,而是通过直接对目标类实现继承,从而创建代理类。相对于jdk动态代理,更加便捷,适用范围更广。

建包如上:

一个cglib的行为控制器 继承的是MethodInterceptor

用于增强以及调用方法 这个与jdk类似  我命名为CGLIBlanjieqi

CglibProxy是抽出来的一个方法主要用于创建生成代理类

Student就是目标类  即需要代理的对象

Test即测试类

Student

MethodInterceptor:

Intercept:

参数:

  1. 代理对象
  2. * 2.方法
    * 3.参数
    * 4.调用代理对象【目标类的子类】或者目标对象的方法
  3. 不能在invokeSuper()

不能写具体的真实对象 因为会报错造成栈满 oom内存溢出  

Cglibproxy

实际上也可不抽出来 单独写也行

这里抽出来只是为了减少代码 看起来美观这样

这里是写了一个泛型的静态方法

为啥用静态方法?:最先被加载  不需要创建类的实例即可调用

然后继承传入的目标类

设置回调  也就是控制代理类的行为

最后成功目标类的代理类

返回代理类

测试类:

这里可以看到  调用了我们抽出来的方法 也就是cglibProxy.getproxy

创建了代理类 我们接收一下 即可调用代理的方法了


到此就学完了Jdk与cglib的动态代理

两者的区别:

动态代理的实现方案有两种,JDK动态代理和CGLIB动态代理,区别在于JDK自带的动态代理,必须要有接口,而CGLIB动态代理有没有接口都可以。

JDK动态代理:JDK原生的实现方式,需要被代理的目标类必须实现接口。因为这个技术要求代理对象和目标对象实现同样的接口(兄弟两个拜把子模式)。

cglib动态代理:通过继承被代理的目标类(认干爹模式)实现代理,所以不需要目标类实现接口。(CGLIB 通过动态生成一个需要被代理类的子类(即被代理类作为父类),该子类重写被代理类的所有不是 final 修饰的方法,并在子类中采用方法拦截的技术拦截父类所有的方法调用,进而织入横切逻辑。)
 

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

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

相关文章

分布式数据库Schema 变更 in F1 TiDB

分布式数据库Schema 变更 in F1 & TiDB 【转载】TiDB 源码阅读系列文章(十七)DDL 源码解析 | PingCAP 上述文章主要叙述了从DDL语句发起到执行的过程,简单介绍了弄一套相同的模式来后台处理数据回填,从而提高DDL的并发度的一…

K8S容器内安装cur/telnet命令(Alpine Linux离线环境安装curl/telnet或其他工具)

背景 需求: 微服务的基础是镜像,通常在最小化的Linux镜像中安装jdk,然后运行编译好的java程序。将镜像运行到K8S上就得到了微服务Pod,Pod通常使用安装K8S时配置的私有网段,与宿主机不同。很多时候需要排查从Pod网段内…

python用pychart库,实现将经纬度信息在地图上显示

python使用pyecharts对给到的经纬度数据进行位置标注,下面是批量更新。给入数据,将地图生成。实验数据在下面附件。 from pyecharts import options as opts from pyecharts.charts import Geo import osfolder_path F:\\GPS file_names os.listdir(f…

ansible-第二天

ansible 第二天 以上学习了ping、command、shell、script模块,但一般不建议使用以上三个,因为这三个模块没有幂等性。举例如下: [rootcontrol ansible]# ansible test -a "mkdir /tmp/1234"[WARNING]: Consider using the file …

Java怎么对复杂的数据类型排序和比大小

目录 一.对复杂的数据类型比大小 Comparable接口 compareTo方法 二.对复杂数据类型排序 三.总结 一.对复杂的数据类型比大小 假如我们现在有个学生类,并且我们实例化出了俩个学生对象,他们各自有各自的名字和年龄属性,我们如何对他们进…

多篇论文介绍-DSConv-原文

论文地址 https://arxiv.org/pdf/1901.01928v1.pdf 目录 01 改进 YOLOv5的交通灯实时检测鲁棒算法 01 作用 02 模型介绍 02 基于改进YOLOv7一tiny 算法的输电线路螺栓缺销检测 01 作用 02 模型介绍 03 结合注意力机制的 YOL&#xff2…

计算机服务器中了mallox勒索病毒怎么解决,勒索病毒解密,数据恢复

企业的计算机服务器为企业的数据存储提供了极大便利,也让企业的生产运行效率得到了极大提升,但是网络数据安全威胁随着技术的不断发展也不断增加。近期,云天数据恢复中心接到很多企业的求助,企业的计算机服务器遭到了mallox勒索病…

黑马点评回顾 redis实现共享session

文章目录 传统session缺点整体访问流程代码实现生成验证码登录 问题具体思路 传统session缺点 传统单体项目一般是把session存入tomcat,但是每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat,并且把自己的信息存放到第一台服务器…

java实现冒泡排序

冒泡排序是一种简单的排序算法&#xff0c;以下是Java实现示例代码&#xff1a; public static void bubbleSort(int[] array) {int n array.length;for (int i 0; i < n - 1; i) {for (int j 0; j < n - i - 1; j) {// 如果前面的元素比后面的元素大&#xff0c;就交…

日常生活小技巧 -- Visual Studio Code 简单使用

讲一下 Visual Studio Code 简单使用&#xff0c;怕以后长时间不用忘记了。 资源管理器 快捷键 ctilshiftE 搜索 快捷键 ctilshiftF 全部折叠 区分大小写、全字匹配 替换、全部替换 切换搜索详细信息 例如排除.h 和 .bat文件 *.h;*.bat源代码管理 暂存更改、放弃更…

macOS文本编辑器 BBEdit 最新 for mac

BBEdit是一款功能强大的文本编辑器&#xff0c;适用于Mac操作系统。它由Bare Bones Software开发&#xff0c;旨在为开发者和写作人员提供专业级的文本编辑工具。 以下是BBEdit的一些主要特点和功能&#xff1a; 多语言支持&#xff1a;BBEdit支持多种编程语言和标记语言&…

数据可视化模板案例:制造业提高生产力的关键

一、模板背景 在这个信息爆炸的时代&#xff0c;数据对于企业的成功至关重要。制造业作为全球经济的重要组成部分&#xff0c;如何有效利用数据提高生产效率、降低成本、优化决策&#xff0c;已成为行业关注的焦点。 二、方案思路 配⾊ - 科技蓝&#xff0c;贴合⼯业主题。 …