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

【Spring AOP】 动态代理

一.AOP常见的实现方式

1.Spring AOP

2.aspectJ

注意:spring使用的是aspectJ的注解,但实现是spring自身实现的.

二.AOP原理

Spirng AOP原理 , 基于动态代理实现的.

三.代理模式

作用就是提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用.

代理模式的主要角色:

1.subject 业务接口类,可以是抽象类或者是接口

2.realSubject 业务实现类,具体的业务执行,也就是被代理对象

3.proxy 代理类

以房东和中介的关系来举例子:

房东是被代理对象

中介是代理对象

买主买房子不是直接找房东,而是通过中介来找到房东,才能买房子;

买主不是直接房东的买房子方法,而是通过中介调用房东的买房子方法;

对应关系

1.subject 业务接口类,可以是抽象类或者是接口

中介要做的事情(房东交给中介的事情)

2.realsubject 业务实现类,具体的业务执行,也就是被代理对象

房东

3.proxy  代理类 , 对于realsubject的代理.

中介

代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的增强.

根据代理的创建时期,代理模式分为静态代理和动态代理.

1.静态代理

由程序员创建代理类或特定工具自动生成源代码再对其编译

在程序运行前,代理类的.class文件就已经存在了 (在出租房子之前,中介就已经做好了相关的工作,就等租户来租房子了)

缺陷: 修改或者新增接口和业务实现类时,还需要修改或者新增代理类

2.动态代理

在程序运行时,运用反射机制动态完成创建 , 相比静态代理来说,动态代理更加灵活.

我们不需要针对每个对象单独创建一个代理对象 , 而是把创建代理对象的工作推迟到程序运行时由JVM来实现

Java也对动态代理进行了实现,并给我们提供了一些API,常见的方式有两种

2.1JDK动态代理

只能代理接口,不能代理对象

实现步骤:

1.定义一个接口及其实现类(静态代理中的HouseSubject 和 RealHouseSubject )

public interface HouseSubject {public void rentHouse();
}/*** 业务接口类*/public class RealHouseSubject implements HouseSubject{@Overridepublic void rentHouse() {System.out.println("我是房东,我要出租房子...");}
}

2.实现InvocationHandler接口,并重写invoke方法,在invoke方法中我们会调用目标方法

public class JDKInvocation implements InvocationHandler {private Object target;//目标对象,被代理对象public JDKInvocation(Object object){this.target=object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("我是中介,开始代理");//通过反射调用被代理类的方法Object retVal=method.invoke(target,args);System.out.println("我是中介,代理结束");return retVal;}
}

3.通过Proxy.newProxyInstance方法创建对象

    public static void mainJDK(String[] args) {HouseSubject target=new RealHouseSubject();//代理接口HouseSubject proxy= (HouseSubject) Proxy.newProxyInstance(target.getClass().getClassLoader(),new Class[]{HouseSubject.class},new JDKInvocation(target));proxy.rentHouse();}

说明:

Proxy类的newProxyInstance方法主要用来生成一个代理对象,这个方法有三个参数:

loader

类加载类,用于加载代理对象

interfaces

被代理类实现的一些接口(决定了JDK只能代理接口)

h

实现InvocationHandler接口的对象

2.2CGlib动态代理

第三方的,需要添加依赖 ;

既可以代理类,也可以代理接口

实现步骤:

1.定义一个类(被代理类)

/*** 业务接口类*/public class RealHouseSubject implements HouseSubject{@Overridepublic void rentHouse() {System.out.println("我是房东,我要出租房子...");}
}

2.自定义MethodInteptor,并重写intercept方法,intercept用于增强目标方法

public class CGLibIntercepter implements MethodInterceptor {private Object target;public CGLibIntercepter(Object object) {this.target = object;}@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("我是中介,开始代理");Object retVal = methodProxy.invoke(target, objects);System.out.println("我是中介,结束代理");return retVal;}}

3.通过Enhancer类的create方法创建类

    public static void main(String[] args) {HouseSubject target=new RealHouseSubject(); //代理接口HouseSubject proxy= (HouseSubject) Enhancer.create(target.getClass(), new CGLibIntercepter(target));proxy.rentHouse();}

注意:CGlib是第三方的开源项目,使用需要添加相关依赖.

面试题

-谈谈Spring AOP是怎么实现的?

基于动态代理实现的

-动态代理是怎么实现的

Spring动态代理是基于JDK和CGlib实现的 

-Spring使用的是哪个

两个都使用的

-何时使用JDK,何时使用CGlib

代理类,只能使用CGlib;

代理接口,可以使用JDK,也可以使用CGlib

(SpringBoot2.x之后,默认使用的是CGlib代理 , 通过设置spring.aop.proxy-target-class=false 可以改成JDK代理 )

相关文章:

【Spring AOP】 动态代理

一.AOP常见的实现方式 1.Spring AOP 2.aspectJ 注意:spring使用的是aspectJ的注解,但实现是spring自身实现的. 二.AOP原理 Spirng AOP原理 , 基于动态代理实现的. 三.代理模式 作用就是提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类…...

NAT——网络地址转换

目录 一、概念 二、NAT的分类 1.静态NAT 1.1 静态NAT的配置 1.2 利用eNSP小实验加强对静态NAT的理解 2、动态NAT 三、NAPT——端口映射 四、Easy IP 使用一个公网地址可以让所有人都上公网 一、概念 随着Internet的发展和网络应用的增多,IPv4地址枯竭已经成为…...

Lambda 表达式的常见用法

文章目录 Lambda 表达式的常见用法使用Lambda表达式集合遍历使用Lambda表达式排序使用Lambda表达式过滤使用Lambda表达式映射使用Lambda表达式归约使用Lambda表达式分组使用Lambda表达式函数式接口的实现使用Lambda表达式线程的创建使用Lambda表达式进行Optional 操作使用Lambd…...

成本管理常用的ChatGPT通用提示词模板

成本分析:如何进行成本分析? 成本核算:如何进行成本核算? 成本控制:如何控制成本? 成本效益分析:如何进行成本效益分析? 成本预测:如何预测成本? 成本决…...

如何在PHP中处理日期和时间?

在 PHP 中,你可以使用内置的 DateTime 类和相关函数来处理日期和时间。以下是一些常见的日期和时间操作的示例: 使用 DateTime 类: 获取当前日期和时间: $currentDateTime new DateTime(); echo $currentDateTime->format(Y-…...

NO-IOT翻频,什么是翻频,电信为什么翻频

1.1 翻频迁移最终的目的就是减少网络的相互干扰,提供使用质量. 1.2 随着与日俱增的网络规模的扩大,网内干扰已成了影响网络的质量标准之一,为了保障电信上网体验,满足用户日益增长的网速需求,更好的服务客户,电信针对…...

云原生之深入解析OOM和CPU节流

一、前言 使用 Kubernetes 时,内存不足 (OOM) 错误和 CPU 节流是云应用程序中资源处理的主要难题,这是为什么呢?云应用程序中的 CPU 和内存要求变得越来越重要,因为它们与云成本直接相关。通过 limits 和 requests ,可…...

数据结构与算法之递归: LeetCode 93. 复原 IP 地址 (Typescript版)

复原 IP 地址 https://leetcode.cn/problems/restore-ip-addresses/ 描述 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.…...

json模块与jsonpath详解

数据提取之JSON与JsonPATH JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。 JSON和XML的比较可谓不…...

ubuntu20.04在noetic下编译orbslam2

ubuntu20.04在noetic下编译orbslam2 参考链接1:https://blog.csdn.net/qq_58869016/article/details/128660588 参考链接2:https://blog.csdn.net/dong123456789e/article/details/129693837 在noetic下的安装环境 1.库安装 sudo apt-get update sudo …...

64. 最小路径和

最小路径和 描述 : 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 题目 : LeetCode 64.最小路径和 64. 最小路径和 解析 : class So…...

惰性加载函数(js的问题)

在web开发中,因为浏览器之间的实现差异,一些嗅探工作总是不可避免。 var addEvent function( elem, type, handler ){if ( window.addEventListener ){return elem.addEventListener( type, handler, false );}if ( window.attachEvent ){return elem.…...

jmeter,读取CSV文件数据的循环控制

1、构造csv数据 保存文件时需要注意文件的编码格式 id,name,limit,status,address,start_time 100,小米100,1000,1,某某会展中心101,2023/8/20 14:20 101,小米101,1001,1,某某会展中心102,2023/8/21 14:20 2、在线程组下添加【CSV数据文件设置】元件 3、CSV文件数据的循环控…...

移植LVGL到像素屏,从此玩转像素屏0门槛

硬件方面 先上渲染图 实物图 配置 主控:esp32 micro32 plus主频:240MhzFlash:8MPSRAM:2M 软件方面 众所周知,LVGL是一个十分优秀的图形框架,小到几百kb的单片机,大到Linux都可以运行。既然它…...

stateflow 之图函数、simulink函数和matlab函数使用及案例分析

目录 前言 1. 图函数graph function 2.simulink function 3.matlab function 4.调用stateflow中的几种函数方式 前言 对于stateflow实际上可以做simulink和matlab的所有任务,可以有matlab的m语言,也可以有simulink的模块,关于几种函数在…...

C# 加载本地文件设置应用程序图标

static class Program{[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Form mainForm new Form1();mainForm.Show();//IntPtr hProcess Process.GetCurrentProcess().MainWindowHandle;// 设置应用程…...

苹果计划将全球1/4的IPhone产能转移至印度

KlipC报道:据相关人士报道,苹果希望在未来2到3年内每年在印度生产超过5000万部iphone,要是该计划得以实现,印度将占领全球iPhone产量的四分之一。 KlipC的分析师Alex Su表示:“此次iPhone15推出是苹果印度制造计划的一…...

el-date-picker 选择一个或多个日期

el-date-picker可选择多个日期 type“dates” 加个s即可 <div><span>el-date-picker选择多个日期</span><el-date-pickertype"dates"v-model"dateList"placeholder"选择一个或多个日期"></el-date-picker></di…...

5个创建在线帮助文档的好方法!

在线帮助文档是企业为用户提供支持服务的重要工具&#xff0c;它能够帮助用户更好地了解和使用产品&#xff0c;提高用户体验。然而&#xff0c;创建一份优秀的在线帮助文档需要掌握一定的技巧和方法。接下来就介绍一下创建在线帮助文档的5个好方法&#xff0c;帮助企业更好地为…...

听GPT 讲Rust源代码--src/tools(14)

File: rust/src/tools/rust-analyzer/crates/cfg/src/lib.rs 在Rust源代码中&#xff0c;rust/src/tools/rust-analyzer/crates/cfg/src/lib.rs这个文件是Rust语言分析器&#xff08;Rust Analyzer&#xff09;的一部分&#xff0c;用于处理和管理条件编译指令&#xff08;Cond…...

终极指南:如何用AntiDupl快速清理电脑中的重复图片,释放宝贵存储空间

终极指南&#xff1a;如何用AntiDupl快速清理电脑中的重复图片&#xff0c;释放宝贵存储空间 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾因为电脑里堆积如…...

GitHub Hovercard常见问题解决方案:为什么Chrome警告读取历史记录?

GitHub Hovercard常见问题解决方案&#xff1a;为什么Chrome警告读取历史记录&#xff1f; 【免费下载链接】github-hovercard Neat hovercards for GitHub. 项目地址: https://gitcode.com/gh_mirrors/gi/github-hovercard GitHub Hovercard是一款为GitHub用户提供整洁…...

终极暗黑模式指南:如何为开发者工具开启护眼模式并提升工作效率

终极暗黑模式指南&#xff1a;如何为开发者工具开启护眼模式并提升工作效率 【免费下载链接】stack-on-a-budget A collection of services with great free tiers for developers on a budget. Sponsored by Mockoon, the best mock API tool. https://mockoon.com 项目地址…...

ARM GICD_CLRSPI_NSR寄存器详解与中断管理实践

1. ARM中断控制器中的GICD_CLRSPI_NSR寄存器解析 在ARM架构的嵌入式系统中&#xff0c;通用中断控制器(GIC)是整个系统的中断管理核心。作为GIC Distributor模块的关键组件&#xff0c;GICD_CLRSPI_NSR寄存器专门用于管理非安全SPI(Shared Peripheral Interrupt)的中断状态。理…...

如何一键解决Windows与iPhone网络共享驱动问题:Apple-Mobile-Drivers-Installer完整指南

如何一键解决Windows与iPhone网络共享驱动问题&#xff1a;Apple-Mobile-Drivers-Installer完整指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目…...

如何精准下载GitHub项目中的特定文件或文件夹

如何精准下载GitHub项目中的特定文件或文件夹 【免费下载链接】DownGit github 资源打包下载工具 项目地址: https://gitcode.com/gh_mirrors/dow/DownGit 在GitHub上查找开源资源时&#xff0c;开发者常常面临一个现实问题&#xff1a;如何仅获取项目中的特定模块而非整…...

基于R语言与MatchIt包实战:绘制多方法对比的标准化平均差(SMD)可视化图

1. 标准化平均差&#xff08;SMD&#xff09;是什么&#xff1f;为什么需要可视化&#xff1f; 标准化平均差&#xff08;Standardized Mean Difference, SMD&#xff09;是衡量两组间协变量差异的常用指标。简单来说&#xff0c;它告诉我们两组数据在某个特征上的差距有多大&…...

YOLO11涨点优化:数据增强 | 引入AutoAugment自动化搜索增强策略,告别手工调参,挖掘最优数据配方

引言:YOLO11训练,为何你的mAP总是差一口气? 训练一个YOLO11模型并不难——几行Python代码就能跑起来。但真正让人崩溃的是:数据标注花了两周,超参数调了三天,mAP就涨了0.3个点。你反复调整旋转角度、翻转概率、HSV色彩偏移的幅度,试图找到那组“最佳”的组合,却发现自…...

TuxGuitar:吉他爱好者的开源乐谱编辑与播放解决方案

TuxGuitar&#xff1a;吉他爱好者的开源乐谱编辑与播放解决方案 【免费下载链接】tuxguitar Open source guitar tablature editor 项目地址: https://gitcode.com/gh_mirrors/tu/tuxguitar 你是否曾经因为找不到合适的吉他谱编辑软件而烦恼&#xff1f;或者想要创作自己…...

面试之关系型数据库

数据库设计三范式第一范式。任何一张表必须有主键&#xff0c;每一个字段具有原子性不可再分。第二范式。所有非主键字段完全依赖主键字段&#xff0c;不存在部分依赖&#xff08;复合主键可能存在此情况&#xff09;。第三范式。所有非主键字段直接依赖于主键字段&#xff0c;…...