Java—代理

news2024/9/22 19:20:56

文章目录

  • 先举一个例子:
  • 开闭原则
  • 什么是代理
    • 两种调用的方式:
  • 代理定义:
  • 代理的实现方式
    • 静态代理
      • 代理的目的:
      • 如何让程序知道要增强的功能是谁?
      • 静态代理缺点:
    • 动态代理
      • 什么是动态代理
      • 动态代理的实现
    • 静态代理和动态代理的区别
      • 静态代理:
      • 动态代理:

——————————————————————————————

先举一个例子:

有一个转账的类:

public class 转账{
    public void 转账 (int num,String A,String B){
        System.out.println(A+"给"+B+"转账"+num);
    }
}

**转账操作:**转账之前需要验证A和B的身份,转账操作、转账之后需要对数据库金额进行改变
将上面三个逻辑写在一个方法当中是不可行的——》在实践过程当中,最好只能对应一个逻辑——》1.调用验证方法 2.调用转账方法 3.操作数据库
为什么实践过程中,一个方法最好只能对应一个逻辑??
——》原因:方法的使用:如果一个方法当中对应这多个逻辑,那么会造成该方法的冗余,一旦条件发生变动,那么对于该方法的改变工程量巨大

开闭原则

例:登录
在这里插入图片描述
如果要新加一个 功能:判断权限(区分管理员和数据库)
-----!!!重新写代码是不可以的(不能在原有的代码基础上进行改变)
原因:违反了程序的设计原则(设计原则【开闭原则】:一个方法对应一个逻辑,已经写好的代码不能进行改变,原因在于调用该方法的代码可能有很多 ,一旦进行改动,那么就会牵一发而动全身)
【开闭原则:程序对访问开放,对修改关闭】
在这里插入图片描述
------可行的方法:
新写代码:写新的类,验证的servlet让用户进行调用
调用的逻辑:调用验证servlet——>调用LoginServlet

什么是代理

代理类控制着对目标类的访问
在这里插入图片描述
在代理当中,login当中的登录方法是不会被直接调用的

两种调用的方式:

第一种,传统的方式,调用登录方法,再进行验证
第二种,直接插入进去,调用方法的时候,验证也就进行了
实际当中用的第二种方式比较多,因为第一种方式比较冗余
在这里插入图片描述

代理定义:

代理定义: 给目标对象提供一个代理对象,并且由 目标对象 控制着对 代理对象 的引用
在传统的方法当中 ——登陆对象和验证对象是相互独立的,从下边的实际案例当中可以看出一个问题,就是用户可以只进行验证不进行登录,或只进行登录不进行验证
在代理方式中 ——在 代理验证 对象当中有loginServlet,我们在调用代理验证对象的login()方法,就一定会执行验证方法
原因在于:代理对象(d)控制着我们对目标对象(loginServlet)的引用
在这里插入图片描述

代理的实现方式

静态代理

静态代理——>一个代理类 代理一个目标类(也可以表述为:一个代理对象控制着一个目标对象)
代理类可以生成代理对象,目标类可以生成目标对象
在这里插入图片描述

代理的目的:

  1. 控制访问: 通过代理对象的方式 间接 去访问目标对象,防止可以直接访问目标对象给系统代理不必要的复杂性
    使用代理,可以让用户想使用目标对象,必须先使用代理对象
    在这里插入图片描述
  2. 功能增强: 通过代理类能够对原有业务进行增强
    在这里插入图片描述

如何让程序知道要增强的功能是谁?

1、接口方式: 通过实现接口的方式知道哪个是要增强的功能
在这里插入图片描述
在这里插入图片描述

静态代理缺点:

静态代理缺点: 静态代理不可以用一个代理类来代理多个目标类,因为违反开闭原则

动态代理

真实被代理的都是由目标类所代理的目标对象

什么是动态代理

动态代理:由动态代理类生成多个代理对象来代理不同的目标类
在这里插入图片描述

动态代理的实现

如何生成不同的代理对象??——>反射
1、确定目标类 (静态代理可以直接确定代理类代理的是哪个对象,但是动态代理类不能直接确定)
—>所以使用object
代理的目标对象由用户直接决定
在这里插入图片描述
在这里插入图片描述
2、功能的增强

  • 1.实现接口,明确要增强的方法

如何实现接口?

实现接口在动态代理当中不能使用implement去实现,要用jdk给我们提供的方法去实现接口,并生成代理对象

因为每次新增一个目标对象就要新增一个接口的话是不理智的
在这里插入图片描述
getInterface返回结果是代理对象

  • 2.明确需要功能增强的方法(方法的调用)------jdk提供了一个接口InvocationHandler
    实现接口,那么接口当中所有的方法都要实现
    在这里插入图片描述
  • invoke方法三个参数: (这三个参数不需要赋值)
    • proxy:object类型
    • method:我们通过反射获取到的目标对象当中,需要增强功能的方法
    • args:该方法的参数
      在这里插入图片描述
      上面:通过反射调用目标类的方法
      上面这两个方法名是一样的,但是代表的意义不一样

静态代理和动态代理的区别

静态代理:

在静态代理类当中,如果新增一个目标类,那我们需要在静态代理类当中创建新增的目标类对象,这样会违反开闭原则。
(下面这样不可行)
在这里插入图片描述
(下面这样可行)
在这里插入图片描述
如果采用新增代理对象的同时也新增代理类——>不可行(理论可行但不现实)
——>所以让一个类生成不同的代理对象来代理不同的目标对象

动态代理:

由动态代理类生成多个代理对象来代理不同的目标类
在这里插入图片描述
代理对象A代理目标对象A,能不能让代理对象A代理目标对象B
—> 答:不可行
—> 原因:代理对象和目标对象之间是有一对一的关联性的
体现在哪里?
—> 体现在代理对象要对目标对象的业务进行增强。代理对象一定要实现目标对象的接口
在这里插入图片描述

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

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

相关文章

26. SAP ABAP OData Gateway 框架里 /IWFND, /IWBEP 这些缩写代表了什么含义?

文章目录 GWFNDBEP本文参考链接本教程前一篇文章 - 25. 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器,我们深入了 SAP ABAP OData 框架来学习其元数据请求的执行明细。 我们在文章里看到了不少以 /IWFND/, /IWBEP 这些命名空…

MAUI Blazor (Windows) App 动态设置窗口标题

原文链接 https://www.cnblogs.com/densen2014/p/16950996.html 接着上一篇"如何为面向 Windows 的 MAUI Blazor 应用程序设置窗口标题?" Tips: 总所周知,MAUI 除了 Windows App 其他平台窗口是没有 Title 这回事的. 在 Blazor 里面可以直接给页面打上…

时间轴-新年倒计时(实操java)

文章目录一、前言二、前端代码实现1、效果图年月日倒计时秒杀1天倒计时秒杀60秒倒计时2、代码实操(微信小程序前端)①在utils文件夹下新建js文件:getperiod.js工具类②引入js,在页面index.js开头引入③完整代码3、倒计时实现①1天…

学习python第一天(数据类型)

关于Python的数据类型 Python数据类型包括: 数字类型,字符类型,布尔类型,空类型,列表类型,元组类型,字典类型 1、数字类型 包括:整型int 浮点型float(有小数位的都是是浮点型) 注…

自己写Spring组件-01手写Bean注册器

简介 在进行web开发的时候,我们经常使用Component、Services、Controller等注解去声明Bean,然后Spring就会帮我们注册。 如果我们想要自己写一个组件(方便后期使用),进行无感引入的时候,就需要自己去注册B…

【计算机网络】计算机网络复习总结 ----- 链路层

计算机网络 内容管理数据链路层 Data Link Layer相关概念术语link 链路data link 数据链路帧 frameMTU maximum transfer Unit 最大传送单元PPP point to point Protcol 点对点协议MAC 地址 media access control网桥 bridge交换机 switch成帧 规则成帧定界字符计数法字符填充分…

QT:文件介绍

UI:QT程序中使用的ui界面就保存在该文件中 组件 设置当前组件的属性 点谁显示谁的属性 调整最终页面的布局,使组件控件在水平或对齐 调整因页面放大缩小时,控件与控件之间的水平和垂直间距 各种各样的按钮 图像显示有关的视图 列表框 各…

Gradle学习笔记之Groovy简单使用

简介 groovy可以当成java的脚本化改良版,同样运行于JVM之上,可以很好地和java代码及相关库进行交互,既可以面向对象编程,也可以用作纯粹的脚本语言。Groovy支持动态类型转换、闭包、元编程、函数式编程、默认作用域为public&…

ArcGIS基础:使用线段分割面数据操作

本操作主要是实现线要素对面要素的分割。 先看一下原始数据,如下所示,2个面,1条线,面被线贯穿过去。 首先进行【面转线】操作,以提取面要素的边界线,如下所示 提取结果如下所示: 然后进行【…

java认证与证书

本文内容主要来自《Java加密与解密的艺术》 目前主要有JKS和PEM两种编码格式文件。 JKS(Java Key Store),Java原生的密钥库/信任库文件。**PEM(Privacy Enbanced Mail,隐私增强邮件)**是使用多种加密方法提…

2022-12-04一周学习

这周基本上还是在对前端学习的更多一点,主要是之前没有重视vue3的学习,现在在补上来,学习了vue3的一些知识,前端的权限管理,设置路由守卫,pinia,还学习了redis的一些基本操作,之前只是照搬了别人…

Linux的线程创建

对于任何一个进程来讲,即便我们没有主动去创建线程,进程也是默认有一个主线程的。线程是负责执行二进制指令的,它会根据项目执行计划书,一行一行执行下去。进程要比线程管的宽多了,除了执行指令之外,内存、…

二、演练领域驱动的设计过程

一、业务分析:统一语言与事件风暴 1、统一语言: 客户明白自己的领域知识也就是业务,以及自己需要解决的问题,也叫做痛点,但是不知道技术。技术人员知道技术,但是不了解客户的业务。所以两者交流起来往往会…

[附源码]计算机毕业设计物品捎带系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

finereport公式帮助

1 if(inarray($$$,ds1.select(销售员))<$TOPN,$$$,"其他")&#xff0c;将第 N 个销售员之后的所有销售员合并为其他&#xff0c; 2 "["((roundup($$$/$num)-1)*$num1)"~"(roundup($$$/$num)*$num)"]" 3 SQL语句用if语句&#xff0c…

HTML网页设计作业:文化网站设计——基于HTML古典中国风工艺美术网页设计(9页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

SpringBoot @InitBinder注解绑定请求参数

参考资料 springMVC之InitBinder 和 ValidatorspringMVC之InitBinder的用法1springMVC之InitBinder的用法2 目录一. 作用二. 前期准备三. Get请求 URL传值处理3.1 前台-test16.html3.2 Controller层3.3 效果四. Post请求 表单传值 自定义日期属性绑定器4.1 前台-test16.htm…

华为机试 - 任务最优调度

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 给定一个正整数数组表示待系统执行的任务列表&#xff0c;数组的每一个元素代表一个任务&#xff0c;元素的值表示该任务的类型。 请计算执行完所有任务所需的最短时间。 任务执行规则如下: 任务可…

Springboot RabbitMq源码解析之RabbitListener注解 (四)

文章目录1.RabbitListener注解介绍2.EnableRabbit和RabbitBootstrapConfiguration3.RabbitListenerAnnotationBeanPostProcessor4.对RabbitListener注解的解析5.RabbitListenerEndpointRegistrar1.RabbitListener注解介绍 RabbitListener是Springboot RabbitMq中经常用到的一个…

D-023 DVI硬件电路设计

DVI硬件电路设计1 简介1.1 连接器1.2 接口信号定义1.3 DVI的分类1.4 DVI规格2 硬件设计实战3 硬件设计要点3.1 注意事项3.2 补充说明3.3 VGA 和 DVI 优缺点1 简介 DVI(Digital Visual Interface)是一种数字视频接口&#xff0c;它是基于TMDS (Transition Minimized Differenti…