当前位置: 首页 > news >正文

【Spring 深入学习】AOP的前世今生之代理模式

AOP的前世今生之代理模式

1. 概述

什么是代理模式呢???

在不修改原有代码 或是 无法修改原有代码的情况下,增强对象功能,替代原来的对象去完成功能,从而达成了拓展的目的。

先给大家看下 JavaScript中实现方式

直接代理window.open函数,在调用window.open之前之后做一些事情

const open = window.open;
window.open = function(...args) {// before todoopen.call(null, ...args);// after todo
}

接下来我们看下Java中是如何实现的???

  • JDK 动态代理

    JDK Proxy 动态代理面向接口的动态代理 一定要有接口和实现类的存在 代理对象增强的是实现类 在实现接口的方法重写的方法生成的代理对象只能转换成 接口的不能转换成 被代理类

  • gclib 动态代理

    面向父类进行动态代理

2. JDK 动态代理

接口定义

public interface Animal {void eat();void say();
}

实现类定义

public class Cat implements Animal {@Overridepublic void eat() {System.out.println("猫要吃饭了");}@Overridepublic void say() {System.out.println("有一个动物 开始说话了");}
}

接下来我们有一个需求,我要代理eat方法,但是不代理say方法。在执行eat方法之前之后 都要执行对应的逻辑。

public class TestJdkProxy {@Testpublic void testJdkProxy() {Animal cat = new Cat();/*** ClassLoader loader => 通过实例获取Class。 再通过Class来获取对应的loader* Class<?>[] interfaces => 通过实例获取Class。 再通过Class来获取定义的接口* InvocationHandler h*/Animal animal = (Animal) Proxy.newProxyInstance(cat.getClass().getClassLoader(), cat.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {/*** proxy 被代理的对象* method 代理的方法* args 代理传递的参数*/Object o;if (method.getName() == "eat") {System.out.println("start ----------------");o = method.invoke(cat, args);System.out.println("end   ----------------");} else {o = method.invoke(cat, args);}return o;}});animal.eat();animal.say();}
}
  1. 通过代码Proxy.newProxyInstance 来获取代理后的实例,我们后续调用方法eat, say 都是基于代理对象的
  2. 需要获取getClassLoader, getInterfaces 我们都可以通过实例.getClass() 来获取
  3. 最重要的就是要实现接口InvocationHandler. 我们一切行为都是基于接口中invoke的方法。

其实JDK 动态代理核心在于:代理实现类,所以我们在接口中所有需要重写的方法都会被代理,然后我们调用的方法就是代理的方法(其实就是方法invoke)

3. gclib 动态代理

gclib动态代理 是基于父类来进行动态代理的。其实就是在运行时生成子类,继承提供的父类。 而我们其实我们手动调用的方法是子类的方法,调用时调用父类方法,从而实现代理。

代码实现逻辑

public class TestCgLib {@Testpublic void testCglib() {Person person = new Person();// 1. 获取Enhancer 对象Enhancer enhancer = new Enhancer();// 2. 设置父类字节码enhancer.setSuperclass(person.getClass());// 3. 获取MethodInterceptor对象 用于定义增强规则MethodInterceptor methodInterceptor = new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {/*** Object o 生成之后的代理对象* Method method 父类中原本要执行的方法* Object[] objects 传递的参数对象* MethodProxy methodProxy 生成的代理的子类*/Object res;if ("eat".equals(method.getName())) {System.out.println("准备开始吃饭...");res = methodProxy.invokeSuper(o, objects);System.out.println("已经吃饭结束...");} else {res = methodProxy.invokeSuper(o, objects);}return res;}};// 4. 设置执行代理回调函数enhancer.setCallback(methodInterceptor);// 5. 获取代理对象Person person1 = (Person) enhancer.create();person1.eat();person1.say();}
}

4. 结论

代理模式是学习AOP的基础,所以理解代理模式的作业方式还是很重要的。Demo源码位置

相关文章:

【Spring 深入学习】AOP的前世今生之代理模式

AOP的前世今生之代理模式1. 概述 什么是代理模式呢&#xff1f;&#xff1f;&#xff1f; 在不修改原有代码 或是 无法修改原有代码的情况下&#xff0c;增强对象功能&#xff0c;替代原来的对象去完成功能&#xff0c;从而达成了拓展的目的。 先给大家看下 JavaScript中实现方…...

操作系统复试

2017软学 给出操作系统的定义&#xff0c;分别从资源管理&#xff0c;任务调度&#xff0c;用户接口等三个方面论述操作系统的职能 操作系统是位于硬件层之上、所有其他系统软件层之下的一个系统软件&#xff0c;使得管理系统中的各种软件和硬件资源得以充分利用&#xff0c;方…...

藏经阁(五)温湿度传感器 SHT3x-DIS 手册 解析

文章目录芯片特性芯片内部框图芯片引脚定义芯片温湿度范围芯片寄存器以及时序讲解信号转换公式芯片特性 湿度和温度传感器完全校准&#xff0c;线性化温度补偿数字输出供电电压范围宽&#xff0c;从2.4 V到5.5 VI2C接口通讯速度可达1MHz和两个用户可选地址典型精度 2% RH和 0.…...

PCB焊盘设计基本原则

SMT的组装质量与PCB焊盘设计有直接的关系&#xff0c;焊盘的大小比例十分重要。如果PCB焊盘设计正确&#xff0c;贴装时少量的歪斜可以再次回流焊纠正(称为自定位或自校正效应)&#xff0c;相反&#xff0c;如果PCB焊盘设计不正确&#xff0c;即使贴装位置十分准确&#xff0c;…...

mysql锁分类大全

前言 为什么会出现锁 MySQL中的锁是为了保证并发操作的正确性和一致性而存在的。 当多个用户同时对同一份数据进行操作时&#xff0c;如果不加控制地进行读写操作&#xff0c;就可能导致数据不一致的问题。例如&#xff0c;当多个用户同时对同一行数据进行写操作时&#xff…...

推荐几款主流好用的远程终端连接管理软件

一、介绍 远程终端连接管理软件是管理服务器、虚拟机等远程计算机系统不可或缺的工具之一&#xff0c;它可以通过网络连接到另一台计算机&#xff0c;以执行命令、编辑文件或进行其他管理任务&#xff0c;下面我将为大家介绍几款主流好用的远程终端连接管理软件&#xff0c;并…...

描述性统计

参考文献 威廉 M 门登霍尔 《统计学》 文章目录定性数据的描述方法条形图饼图帕累托图定量数据点图茎叶图频数分布直方图MINITAB 工具在威廉《统计学》一书将统计学分为描述统计学和推断统计学&#xff0c;他们的定义分别如下&#xff1a;描述统计学&#xff1a;致力于数据集的…...

第十四届蓝桥杯三月真题刷题训练——第 7 天

目录 第 1 题&#xff1a;三角回文数 问题描述 答案提交 运行限制 代码&#xff1a; 第 2 题&#xff1a;数数 问题描述 答案提交 运行限制 代码&#xff1a; 第 3 题&#xff1a;倍数问题_同余定理_分情况讨论 题目描述 输入描述 输出描述 输入输出样例 运行限…...

剑指 Offer 57. 和为s的两个数字

一、题目 输入一个递增排序的数组和一个数字s&#xff0c;在数组中查找两个数&#xff0c;使得它们的和正好是s。如果有多对数字的和等于s&#xff0c;则输出任意一对即可。 示例 1&#xff1a; 输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1a;[2,7] 或者 [7…...

PDF转word在线转换方法!操作简单又高效

相信很多已经工作的人都知道&#xff0c;PDF文件格式的优点在于兼容性强、安全性高&#xff0c;而且查看和传输给他人都很方便。但是&#xff0c;这种格式的文件也有不太方便的地方&#xff0c;那就是不能对文件内容进行编辑和修改。对于许多人来说&#xff0c;如果想要编辑修改…...

Jquery项目中使用vue.js

大家在工作的情况中&#xff0c;可能会遇到之前的老项目采用jq书写&#xff0c;或者修改或者新增功能在jq中&#xff0c;原始jq的项目,代码可维护性很差,一个页面几千行jq,可维护性很差,工作量巨大&#xff0c;所以这个时候大家可以引入vue.js。 第一步&#xff1a;引入vue.js…...

蓝桥杯 删除字符

题目描述 给定一个单词&#xff0c;请问在单词中删除 t 个字母后&#xff0c;能得到的字典序最小的单词是什么&#xff1f; 输入描述 输入的第一行包含一个单词&#xff0c;由大写英文字母组成。 第二行包含一个正整数 t。 其中&#xff0c;单词长度不超过 100&#xff0c…...

析构函数 对象数组 对象指针

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章 &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下定决心去做” &#x1…...

Vue对Axios网络请求进行封装

一、为什么要对网络请求进行封装&#xff1f; 因为网络请求的使用率实在是太高了&#xff0c;我们有的时候为了程序的一个可维护性&#xff0c;会把同样的东西放在一起&#xff0c;后期找起来会很方便&#xff0c;这就是封装的主要意义。 二、如何进行封装&#xff1f; 1、将…...

Android framework HAL(HIDL)

简述 当你在Android系统中使用不同的硬件设备&#xff08;例如摄像头、传感器、音频设备等&#xff09;时&#xff0c;你需要与硬件抽象层&#xff08;HAL&#xff09;进行通信。 HAL是一个中间层&#xff0c;它充当了硬件和应用程序之间的桥梁。但是&#xff0c;由于硬件设备…...

QML 模型(ListModel)

LIstModel&#xff08;列表模型&#xff09; ListModel 是ListElement定义的简单容器&#xff0c;每个定义都包含数据角色。内容可以在 QML 中动态定义或显式定义。 属性&#xff1a; count模型中数据条目的数量dynamic动态角色&#xff0c;默认情况下&#xff0c;角色的类型…...

你还在调戏AI,有的公司已经用ChatGPT开展业务了

近日&#xff0c;OpenAI 正式宣布开放 ChatGPT 和 Whisper 两个模型的 API&#xff0c;API 版本的ChatGPT 不仅功能更多、性能更强&#xff0c;而且还更便宜一一相当于目前 GPT-3 模型价格打一折!划重点OpenAl正式开放 ChatGPT 和 Whisper 模型的 API&#xff0c;目前 SnapChat…...

DatenLord前沿技术分享 No.20

达坦科技专注于打造新一代开源跨云存储平台DatenLord&#xff0c;致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题&#xff0c;以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。喷泉码具有极高的纠错能力&#xff0c;且具有低延迟、地复…...

基于vivado(语言Verilog)的FPGA学习(1)——了解viviado面板和编译过程

基于vivado&#xff08;语言Verilog&#xff09;的FPGA学习&#xff08;1&#xff09;——了解程序面板和编译过程 每日废话&#xff1a;最近找实习略微一些焦虑&#xff0c;不想找软件开发&#xff0c;虽然有些C和python基础&#xff08;之前上课学的&#xff09;&#xff0c;…...

PACS(CT、CR、DR、MR、DSA、RF医院影像管理系统源码)

PACS具体功能介绍&#xff1a; 病人、采集、观片、三维、报告、照相、退出、文件、图像采集、观片操作、三维、测量标注、诊断报告、照相打印、统计报表、系统管理、帮助、病人浏览器、选择数据源、打开图像、病人登记、工作列表、采集、打开画廊。 DICOM查询/获取&#xff1a…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...