代理模式-静态动态代理-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.mzph.cn/news/141652.shtml

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

相关文章

MySQL(15):存储过程与函数

存储过程概述 含义: 存储过程的英文是 Stored Procedure 。它的思想很简单,就是一组经过 预先编译 的 SQL 语句的封装。 执行过程: 存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用…

一文简单聊聊protobuf

目录 基本介绍 原理 同类对比 为什么要使用protobuf? 基本介绍 protobuf的全称是Protocol Buffer,是Google提供的一种数据序列化协议。Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储…

RFID技术在仓储物流管理中的应用方案

一、方案背景 当前市场竞争日益激烈,提高生产效率、降低运营成本对来说企业至关重要,仓储物流管理在各个行业广泛应用,设计和建立完善的仓储管理流程,提高仓储周转效率,减少运营资金的占用,将冻结的资产转…

github私有仓库开发,公开仓库发布版本

文章目录 github私有仓库开发,公开仓库发布版本需求背景实现思路GitHub Releases具体步骤广告 github私有仓库开发,公开仓库发布版本 需求背景 github私有仓库开发,公开仓库发布版本,既可以保护源代码,又可以发布版本给用户使用。许多知名软件项目都采用了这样的开…

多机器人群体的任务状态与机器人状态同步设计思路

背景技术 近年来,随着科学技术的发展需要,机器人技术不断进步。面临任务的日益复杂化,单机器人在很多环境下已经无法满足生产要求,于是国内外科研工作者对多机器人技术投入了大量关注,提出了利用多机器人协作来代替单机…

拍摄视频的时候相机断电导致视频文件损坏,怎么修复

3-4 现在好多人都有自己的相机,但是专业用来录像的机器应该是不太可能都有的,相机的稳定性会比专业的机器差一些,如果用于比较重要的场景,比如婚庆、会议录像、家庭录像使用等,有较少的概率会出现一些奇怪的情况&…

YOLOv8-Seg改进:卷积变体系列篇 | DCNv3可形变卷积基于DCNv2优化 | CVPR2023

🚀🚀🚀本文改进:DCNv3算子,基于DCNv2算子引入共享投射权重、多组机制和采样点调制,引入到YOLOv8,与C2f结合实现二次创新; 🚀🚀🚀DCNv3 亲测在多个数据集能够实现涨点,同样适用于小目标分割 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐…

一个关于jdbc操作mysql和java基础练手的通讯录管理系统小项目

首先 : 整个项目的项目结构为 : 1.第一步先导入数据库的驱动,我的mysql数据库是8.0以上版本,然后导入的驱动就是8.0.16版本的jar包; 1.JdbcBase : JDBC基础操作封装成了JdbcBase类,在里面先静态定义了数据库连接对象和DQL查询结果&#x…

CoreByte多云管理平台,国际站自助注册及充值教程

国际云的免实名备案优势为企业及个人提供灵活、可选择的云服务器资源,全球性的覆盖和高度可定制化的服务,使企业和个人可以在全球范围内高效运营,CoreByte独家签署多家云厂商,包含:阿里云、华为云、腾讯云、AWS等&…

Linux 程序开发流程 / 基本开发工具 / Vim / GCC工具链 / Make 工具 / Makefile 模板

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料(如 百问网的《嵌入式Linux应用开发完全手册》,在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO:开发板资料》或《2.2 全系列Linux教程&#xf…

android 10车载桌面ActivityView触摸事件源码详解分析

hi,粉丝朋友们: 背景 大家好!近来居然有好几个粉丝朋友居然问到了一个虚拟屏幕触摸相关的问题,还有老版本android 10上面有个车载桌面使用的ActivityView可以正常触摸的问题。 其实这个ActivityView在最新的版本已经没有了&…

Node.js 框架 star 星数量排名——NestJs跃居第二

文章目录 什么是NodeJs?什么是NodeJs框架?图表数据框架排名 什么是NodeJs? Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得我们可以在服务器端使用JavaScript开发高效、可扩展的应用程序。作为一个快速、轻量级的平台,Node.js在Web开发领…

企业计算机中了eking勒索病毒如何解毒,eking勒索病毒文件恢复

网络技术的不断发展,为企业的生产生活提供了极大便利,但随之而来的网络安全威胁也不断增加,近期,很多企业的计算机服务器遭到了eking勒索病毒攻击,导致企业的计算机服务器所有数据被加密,无法正常使用&…

深眸科技聚焦3D机器视觉技术,从技术形态到应用前景实现详细分析

机器视觉技术的不断升级,使得对二维图像的处理逐渐扩展到了更复杂的三维领域,形成了3D机器视觉。3D机器视觉是机器视觉的重要应用领域之一,通过计算机能够在短时间内处理视觉传感器采集的图像信号,从而获得目标对象的三维信息。 …

C++ 11 新特性

目录 1. 支持特性的编译器版本2. 模板表达式中空格3. 空指针4. auto5. 统一初始化6. explict7. 范围for8. default,delete9. 化名模板(alias template)10. using11. noexcept12. override13. final14. decltype15. lambda16. Variadic Templa…

SpringBoot整合Activiti7——定时器事件(九)

文章目录 定时器事件时间定义时间固定时间段时间周期 1.开始事件2.中间事件3.边界事件代码实现xml文件自定义服务任务监听器自定义用户任务监听器测试流程流程执行步骤 定时器事件 可以用在开始事件、中间事件、边界事件上,边界事件可以是中断和非中断边界事件 需要…

基于springboot实现小学家校一体“作业帮”系统项目【项目源码】计算机毕业设计

基于springboot实现小学家校一体“作业帮”系统演示 Java语言简介 Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具…

Scala---数据基础

一、数据类型 二、变量和常量的声明 定义变量或者常量的时候,也可以写上返回的类型,一般省略,如:val a:Int 10常量不可再赋值 1./** 2. * 定义变量和常量 3. * 变量 :用 var 定义 ,可修改 4. * 常量 :用 val 定…

黑马程序员微服务Docker实用篇

Docker实用篇 0.学习目标 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…

[极客大挑战 2019]BuyFlag 1(两种解法)

题目环境: FLAG NEED YOUR 100000000 MONEY flag需要你的100000000元 F12瞅瞅源代码: if (isset($_POST[password])){ $password $_POST[password]; if (is_numeric($password)) { echo "password cant be number" } elseif ($pas…