Spring的代理模式

article/2025/10/2 7:27:46

1、代理模式

为什么要学习代理模式?

因为这就是springAOP的底层!【springAOP和springMVC】

代理模式的分类:

  • 静态代理
  • 动态代理

1.1、静态代理

角色分析:

  • 抽象角色:一般会使用接口或者抽象类来解决
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作
  • 客户:访问代理对象的人!

代码步骤:

  • 1.接口 ——Rent

    //出租房子
    public interface Rent {void rent();
    }
    
  • 2.真实角色——Host

    //房东
    public class Host implements Rent {@Overridepublic void rent() {//打印System.out.println("房东有房子出租!");}
    }
    
  • 3.代理角色——Proxy

    //中介
    public class Proxy implements Rent {private Host host;public Proxy() {}public Proxy(Host host) {this.host = host;}@Overridepublic void rent() {host.rent();seeHouse();hetong();fare();}public void seeHouse() {//打印System.out.println("See House 看房子");}public void hetong(){//打印System.out.println("签约租凭合同");}public void fare(){//打印System.out.println("收取中介费用!");}
    }
    
  • 4.客户端访问代理角色——Client

    public class Client {//这是一个main方法,是程序的入口:public static void main(String[] args) {//房东出租房子给中介代理Host host = new Host();//代理。帮助房东出租房子,会有一些附属的操作Proxy proxy = new Proxy(host);//proxy.rent();}
    }
    

小结

代理模式的好处:

  • 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
  • 公共也就就交给代理角色!实现了业务的分工!
  • 公共业务发生扩展的时候,方便集中管理!

缺点:

一个真实角色就会产生一个代理角色;代码量会翻倍开发效率会变低

1.2、加深理解

UserService

public interface UserService {public void add();public void delete();public void update();public void query();
}

UserServiceImpl——真实对象

//真实对象
public class UserServiceImpl implements UserService{@Overridepublic void add() {System.out.println("增加了一个用户");}@Overridepublic void delete() {System.out.println("删除了一个用户");}@Overridepublic void update() {System.out.println("修改了一个用户");}@Overridepublic void query() {System.out.println("查询了一个用户");}
}

UserServiceProxy——代理

public class UserServiceProxy implements UserService{private UserServiceImpl userService;public void setUserService(UserServiceImpl userService) {this.userService = userService;}@Overridepublic void add() {log("add");userService.add();}@Overridepublic void delete() {log("delete");userService.delete();}@Overridepublic void update() {log("update");userService.update();}@Overridepublic void query() {log("query");userService.query();}//日志方法public void log(String msg){System.out.println("使用了"+msg+"方法");}
}

加粗样式Client

public class Client {public static void main(String[] args) {UserServiceImpl userService = new UserServiceImpl();UserServiceProxy proxy = new UserServiceProxy();proxy.setUserService(userService);proxy.add();}
}

1.3、动态代理

动态代理和静态代理角色一样

动态代理的代理类是动态生成的,不是我们直接写好的!

动态代理分为两大类:基于接口的动态代理,基于类的动态代理

  • 基于接口-JDK 动态代理【我们在这里使用】
  • 基于:cglib
  • java字节码实现:javasist

需要了解两个类:

  • Proxy:代理,
  • InvocationHandler:调用处理程序,是由代理实例的调用处理程序实现的接口。

在这里插入图片描述

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)                    //返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。  /**
所需三个参数参数 
loader - 类加载器来定义代理类 ,需要一个
interfaces - 代理类实现的接口列表 
h - 调度方法调用的调用处理函数 newProxyInstance,方法有三个参数:
loader: 用哪个类加载器去加载代理对象
interfaces/:动态代理类需要实现的接口
h:动态代理方法在执行时,会调用h里面的invoke方法去执行
*//**
* ClassLoader loader 类加载器,用于加载代理对象的字节码
* Class<?>[] interfaces 字节码数组,用于让代理对象和被代理对象有相同的方法
* InvocationHandler h 处理方法,用于方法增强
*/Object invoke(Object proxy, 方法 method, Object[] args) //处理代理实例上的方法调用并返回结果。  /**
* Object proxy 被代理的类
* Method method 被代理类的方法
* Object[] args 方法参数
*/

ProxyInvocationHandler

//自动生成代理类!
public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Rent rent;public void setRent(Rent rent) {this.rent = rent;}//生成代理类public Object getProxy() {//第一个参数:目标对象类的加载器,第二个参数:目标对象相同的接口字节码对象数组,第三个参数:InvocationHandler对象return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);}//调用代理对象的任何方法,实质执行的都是invoke方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {seeHouse();//动态代理的本质,就是使用反射机制实现的Object invoke = method.invoke(rent, args);//目标方法hetong();fare();return invoke;}public void seeHouse() {//打印System.out.println("See House 看房子");}public void hetong() {//打印System.out.println("签约租凭合同");}public void fare() {//打印System.out.println("收取中介费用!");}}

Client

public class Client {//这是一个main方法,是程序的入口:public static void main(String[] args) {//真实角色Host host = new Host();//代理角色。ProxyInvocationHandler pih = new ProxyInvocationHandler();//通过调用处理角色来处理我们调用的接口对象pih.setRent(host);Rent proxy =(Rent) pih.getProxy();proxy.rent();}
}

真正动态

public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Object target;public void setTarget(Object target) {this.target = target;}//生成得到代理类public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);}//处理代理实例,返回结果@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {log(method.getName());Object result = method.invoke(target,args);return result;}public void log(String msg){System.out.println("执行了"+msg+"方法");}}
import com.blue.demo02.UserService;
import com.blue.demo02.UserServiceImpl;public class Client {public static void main(String[] args) {//真实角色UserServiceImpl userService = new UserServiceImpl();//代理角色:现在没有ProxyInvocationHandler pih = new ProxyInvocationHandler();pih.setTarget(userService);//通过调用程序处理角色 来处理我们要调用的接口对象UserService proxy = (UserService) pih.getProxy();proxy.delete();}
}

动态代理的好处:

  • 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务!
  • 公共也就就交给代理角色!实现了业务的分工!
  • 公共业务发生扩展的时候,方便集中管理!
  • 一个动态代理类代理的是一个接口,一般就是对应的一类业务!
  • 一个动态代理类可以代理多个类,只要是实现了同一个接口即可!

https://cloud.tencent.com/developer/support-plan?invite_code=tf892a33j43m


http://chatgpt.dhexx.cn/article/8aBQV5M5.shtml

相关文章

代理模式(Proxy模式)详解

在有些情况下&#xff0c;一个客户不能或者不想直接访问另一个对象&#xff0c;这时需要找一个中介帮忙完成某项任务&#xff0c;这个中介就是代理对象。例如&#xff0c;购买火车票不一定要去火车站买&#xff0c;可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保…

代理模式的详细介绍

国庆期间闲来无事&#xff0c;写了一个简单的小程序&#xff0c;小程序名称叫做 IT藏经楼。目的是分享这些年自己积累的一些学习材料&#xff0c;方面大家查找使用&#xff0c;包括电子书、案例项目、学习视频、面试题和一些PPT模板。里面所有材料都免费分享。目前小程序中只发…

代理模式

代理模式 代理模式应用场景模式结构实现方式 代理模式 控制着对于原对象的访问&#xff0c; 并允许在将请求提交给对象前后进行一些处理。 优点&#xff1a; 在客户端与目标对象之间起到一个中介作用和保护目标对象的作用&#xff1b;代理对象可以扩展目标对象的功能&#x…

代理模式详解

1. 代理模式 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。 代理模式一半包含三种角色&#x…

代理模式详细讲解

文章目录 一、什么是代理模式&#xff1f;二、 为什么使用代理模式&#xff1f;三、 代理模式的实现1、静态代理1.1、 创建公共的接口1.2、 创建被代理角色1.3、 创建代理角色1.4、 创建测试类 2、动态代理的实现2.1、 使用 JDK 的 Proxy 类实现动态代理1、 创建业务接口2、 创…

一文搞懂代理模式

代理模式 前言一、代理模式是什么&#xff1f;二、静态代理三、动态代理1.jdk动态代理&#xff08;接口代理&#xff09;2.cglib动态代理 前言 一、代理模式是什么&#xff1f; 代理模式是常见的设计模式之一&#xff0c;顾名思义&#xff0c;代理模式就是代理对象具备真实对象…

手机测试耳机音质的软件,耳机音质测试软件有哪些

耳机音质测试软件并不存在&#xff0c;因为耳机的音质对于人来说是主观的&#xff0c;你认为音质好的耳机&#xff0c;有的人却并不认为也很正常&#xff0c;国内外都没有恒定的耳机音质评判标准&#xff0c;大多数人认为音质好的耳机&#xff0c;那么它十有八九实际就是好的。…

软件测试的基本理论与方法

文章目录 前言软件测试基础1. 软件测试的概念2. 软件测试的目的 测试用例1. 测试用例的概念2. 测试用例的分类3. 测试用例的治理4. 测试用例的编制及使用5. 测试需求 软件生命周期1. 问题的定义及规划2. 需求分析3. 软件设计4. 程序编码5. 软件测试6. 运行维护7. 生命周期模型 …

固态硬盘测试软件有哪些,SSD测试软件有哪些?SSD测试软件盘点

在购买了固态硬盘(SSD)后&#xff0c;如果对商家或官方给出的诸如读写速度等关键性数据存在质疑的话&#xff0c;最好的解决方法莫过于通过SSD测试软件来找寻答案。那么&#xff0c;SSD测试软件有哪些&#xff1f;SSD测试软件哪个比较好用呢&#xff1f;针对上述问题&#xff0…

软件工程-软件测试-测试方法

软件工程-测试方法-白盒和黑盒测试 软件工程-软件测试 软件测试方法可以分为静态测试和动态测试。 静态测试 静态测试是指被测试程序不在程序上运行&#xff0c;而是采用人工检测和计算机辅助金泰分析的手段对程序进行检测。 静态测试方法 &#xff08;1&#xff09;人工检…

软件测试方法和技术有哪些?

软件测试方法和技术有哪些&#xff1f;包括软件测试基础、软件测试方法、软件测试流程和规范、单元测试与集成测试、系统测试、验收测试、软件本地化测试、测试自动化及其框架、白盒测试和黑盒测试等。 软件测试方法技术   软件测试方法&#xff1a; 一、等价类测试方法的…

软件测试方法汇总 - 从不同角度分析软件测试方法有哪些

1、从是否关心内部结构来看 &#xff08;1&#xff09;白盒测试&#xff1a;又称为结构测试或逻辑驱动测试&#xff0c;是一种按照程序内部逻辑结构和编码结构&#xff0c;设计测试数据并完成测试的一种测试方法。 &#xff08;2&#xff09;黑盒测试&#xff1a;又称为数据驱…

常见的软件测试方法有,常见的几种软件测试方法都有哪些

随着互联网的不断发展&#xff0c;越来越多的人也都开始学习软件测试的相关技术&#xff0c;而今天我们就一起来了解一下&#xff0c;常见的几种软件测试方法都有哪些。 1、单元测试 单元测试测试的是代码库的单元。 它们直接调用函数或单元&#xff0c;并确保返回正确的结果。…

Dynatrace系列之- 标记常见问题

Dynatrace系列之- 标记常见问题 在大型环境中&#xff0c;系统的某些方面可能会持续触发不必要的警报。这些告警可能来自非关键组件或者是非关键情况下的资源不足的问题。通常这些问题不需要人员响应。 为了减少此类警报并避免发出垃圾告警邮件&#xff0c;Dynatrace AI根因分…

什么是 Dynatrace 里的 Visually Complete 度量标准

Dynatrace 中的 Visually Complete 是一个度量标准&#xff0c;用于测量在加载过程中用户在页面上看到的内容。Visually Complete 指标是当一个用户看到页面上的所有重要元素并且它们正确地渲染时所测量的时间点。这意味着所有可见的文本、图像和视频都已加载并正确显示。该指标…

DevSecOps 团队请避免陷入这些可观测性陷阱

如果您发现难以管理跨越多个云运行不断变化的容器化工作负载的庞大基础架构&#xff0c;那么您并不孤单。 根据 Dynatrace 近期发布的一项研究&#xff0c;超过一半的组织的 DevSecOps 团队在可观测性数据方面感到痛苦。 多云和混合计算设置的兴起&#xff0c;使大部分组织能够…

前端性能分析工具Dyna Trace使用心得(转)

什么是dynatrace ajax “dynatrace ajax 是一个详细的底层追踪工具&#xff0c;它不仅可以显示所有请求和文件在网络中传输的时间&#xff0c;还会记录浏览器render&#xff0c;CPU消耗、JS解析和运行情况等详细的信息&#xff0c;而这些也只是dynatrace ajax的冰山一角。” 为…

使用dynatrace+showslow进行前端性能测试

原文&#xff1a;http://blog.csdn.net/zhangren07/article/details/6883617 1.背景 应用的性能测试与优化目前主要停留在服务器端的反馈&#xff0c;而对于前端性能标准的研究与测试相对比较空白&#xff0c;缺乏统一的标准与工具。众所周知&#xff0c;浏览器html组件的下载…

什么是 Dynatrace 里的 User Action

用户操作是与最终用户界面的交互&#xff0c;涉及对 Web 服务器的调用&#xff0c;这可能有多个嵌套调用。 它是由用户输入&#xff08;例如页面加载、单击或触摸&#xff09;触发的从一个视图到另一个视图的转换。 Web 应用的 User Action 类型&#xff1a; Load actionsXHR …

Ultra Fast Deep Lane Detection with HybridAnchor Driven Ordinal Classification

Abstract 我们将车道检测过程视为一个使用全局特征的锚定驱动的有序分类问题。 首先&#xff0c;我们在一系列混合&#xff08;行和列&#xff09;锚点上用稀疏坐标表示车道。在锚驱动表示的帮助下&#xff0c;我们将车道检测任务重新表述为一个有序分类问题&#xff0c;以得到…