Spring AOP(3)
目录
Spring AOP原理
代理模式
代理模式中的主要角色
静态代理
动态代理
总结:面试题
什么是AOP?
Spring AOP实现的方式有哪些?
Spring AOP实现原理
Spring使用的是哪种代理方式?
JDK和CGLIB动态代理的区别?
Spring AOP原理
代理模式
代理模式, 也叫委托模式.
定义: 为其他对象提供一种代理以控制对这个对象的访问. 它的作用就是通过提供一个代理类, 让我们在调用目标方法的时候, 不再是直接对目标方法进行调用, 而是通过代理类间接调用.
在某些情况下, 一个对象不适合或者不能直接引用另一个对象, 而代理对象可以在客户端和目标对象之间起到中介的作用.
使用代理前:
使用代理后:

比如当进行房屋租赁时, 房主会将房屋授权给中介, 由中介来代理看房, 房屋咨询等服务.
代理模式中的主要角色
1.Subject: 业务接口类. 可以是抽象类或者接口(不一定有)
2.RealSubject: 业务实现类. 具体的业务执行, 也就是被代理对象.
3.Proxy:代理类. RealSubject的代理.
譬如房屋租赁
Subject: 就是提前定义了房东要做的事情, 交给中介代理, 也是中介要做的事情.
RealSubject: 房东
Proxy: 中介
UML类图如下:

代理模式可以在不修改被代理对象的基础上, 通过扩展代理类, 进行一些功能的附加和增强.
根据代理的创建时期, 代理模式分为静态代理和动态代理.
静态代理: 由程序员创建代理类或特定工具自动生成源代码再对其编译, 让程序运行前代理类的 .class 文件就已经存在了.
动态代理: 在程序运行时, 运用反射机制动态创建而成.
静态代理
静态代理: 在程序运行前, 代理类的.class文件就已经存在了. (在出租房子之前, 中介已经做好了相关的工作, 就等租户来租房子了).
以房屋租赁为例编写代码:
1.定义接口(定义房东要做的事情, 也是中介需要做的事情).
public interface HouseSubject {void rentHouse();
}
2.实现接口(房东出租房子)
public class RealHouseSubject implements HouseSubject{@Overridepublic void rentHouse() {System.out.println("我是房东, 我出租房⼦");}
}
3.代理(中介, 帮房东出租房子)
public class HouseProxy implements HouseSubject{//将被代理对象声明为成员变量private HouseSubject houseSubject;public HouseProxy(HouseSubject houseSubject) {this.houseSubject = houseSubject;}@Overridepublic void rentHouse() {//开始代理System.out.println("我是中介, 开始代理");//代理房东出租房⼦houseSubject.rentHouse();//代理结束System.out.println("我是中介, 代理结束");}
}
4.使用:
public class StaticMain {public static void main(String[] args) {HouseSubject subject = new RealHouseSubject();//创建代理类HouseProxy proxy = new HouseProxy(subject);//通过代理类访问⽬标⽅法proxy.rentHouse();}
}
运行结果:

上面代理的实现方式就是静态代理.
从上述程序中可以看出, 虽然静态代理完成了对目标对象的代理, 但是由于代码都写死了, 对目标对象的每个方法的增强都是手动完成, 非常不灵活.
比如当增加业务时(增加房屋出售), 就还是要编写大量代码.
我们修改接口(Subject)和业务实现类(RealSubject)时, 还需要修改代理类(Proxy).
同样地, 如果有新增接口(Subject)和业务实现类(RealSubject), 也需要对每个业务实现类新增代理类(Proxy).
动态代理
相比于静态代理来说, 动态代理更加灵活.
我们不需要针对每个目标对象都单独创建一个代理对象, 而是把这个创建代理对象的工作推迟到程序运行时由JVM实现. 也就是说动态代理在程序运行时, 更具需要动态创建生成.
比如房屋中介, 我不需要提前预测都有哪些业务, 而是业务来了我再根据情况创建.
Java也对动态代理进行了实现, 并给我们提供了一些API, 常见的实现方式有两种:
1.JDK动态代理.
2.CGLIB动态代理.
一般代理模式开发人员基本用不着,一般是开发框架的人用的, 所以不过多介绍(看了估计也容易忘), 仅给出代码:
//JDK代理
public class JDKInvocationHandler implements InvocationHandler {private RealHouseSubject target;public JDKInvocationHandler(RealHouseSubject target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("开始代理");Object o = method.invoke(target, args);System.out.println("结束代理");return o;}
}//main方法RealHouseSubject subject = new RealHouseSubject();Subject proxy= (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(),new Class[]{Subject.class},new JDKInvocationHandler(subject));proxy.rentHouse();
主要这里注意两个区别:
JDK可以代理接口, 不可以代理类.
CGLIB既可以代理接口也可以代理类.
注意Spring和SpringBoot在这里AOP的实现也是有差异的, 代理工厂中有一个参数proxyTargetClass. 默认Spring是false, 默认接口使用jdk代理. SpringBoot从2.x之后设置为true, 默认全部使用CGLib实现代理.
总结:面试题
什么是AOP?
答: AOP是一种思想, 是对某一类事情的集中处理. Spring框架实现了AOP, 所以称为SpringAOP.
Spring AOP实现的方式有哪些?
1.基于注解@Aspect来实现.
2.基于自己写的@MyAspect自定义注解来实现
3.基于XML配置的方式实现.
4.基于代理实现.
Spring AOP实现原理
Spring AOP主要使用到了动态代理的方式: 动态代理是一种在运行时生成代理对象的机制, Spring AOP利用动态代理技术在方法调用时将切面逻辑织入目标对象中, 实现横切关注点的功能. 具体来说, Spring AOP使用JDK动态代理和CGLIB动态代理来实现对目标对象的代理, 以便在方法调用前后执行额外逻辑.
Spring使用的是哪种代理方式?
在Spring中, 代理工厂中的proxyTargetClass 默认为false. 如果实现了接口, 就是用JDK代理. 如果未实现接口只有实现类, 就是用CGLib代理.
从Spring Boot从2.x之后, proxyTargetClass默认为true, 默认使用CGLib代理
JDK和CGLIB动态代理的区别?
JDK动态代理适用于代理实现了接口的对象, 而CGLIB动态代理适用于代理没有实现接口的对象. JDK动态代理利用反射生成代理对象. 而CGLIB动态代理则是通过继承目标对象并重写方法来实现代理.
相关文章:
Spring AOP(3)
目录 Spring AOP原理 代理模式 代理模式中的主要角色 静态代理 动态代理 总结:面试题 什么是AOP? Spring AOP实现的方式有哪些? Spring AOP实现原理 Spring使用的是哪种代理方式? JDK和CGLIB动态代理的区别? Spring AOP原理 代理模式 代理模式, 也叫委托模式. …...
推荐5个免费的国内平替版GPT
提起AI,大家第一个想到的就是GPT。 虽然它确实很厉害,但奈何于我们水土不服,使用门槛有些高。 不过随着GPT的爆火,现在AI智能工具已经遍布到各行各业了,随着时间的推移,国内的AI工具也已经“百花盛放”了…...
弹性云服务器是什么,为何如此受欢迎
云计算作为当下炙手可热的技术领域,已然成为现代企业不可或缺的核心能力。云服务器作为云计算的基石之一,在这个数字化时代发挥着至关重要的作用。而弹性云服务器,作为云服务器的一种演进形式,更是备受瞩目。 弹性云服务器&#…...
Docker部署RabbitMQ与简单使用
官网地址: Messaging that just works — RabbitMQ 我的Docker博客:Docker-CSDN博客 1.结构 其中包含几个概念: **publisher**:生产者,也就是发送消息的一方 **consumer**:消费者,也就是消费消息的一方 …...
2024年黄石市建设优质工程评价认定申报条件、流程及材料合集
2024年黄石市建设优质工程评价认定申报条件、流程及材料合集如下,黄石市的企业单位可以了解一下,有疑问名字找我哦。 第一章总则 第一条为贯彻落实《中华人民共和国建筑法》、《安全生产法》、《建设工程质量管理条例》、《建设工程安全生产管理条例》…...
偏微分方程算法之混合边界条件下的差分法
目录 一、研究目标 二、理论推导 三、算例实现 四、结论 一、研究目标 我们在前几节中介绍了Poisson方程的边值问题,接下来对椭圆型偏微分方程的混合边值问题进行探讨,研究对象为: 其中,为矩形区域,为上的连续函数…...
apollo资料整理
Application X: Application X Apollo: Apollo 自动驾驶开放平台 Cyber RT API tutorial — Cyber RT Documents documentation Cyber RT API tutorial — Cyber RT Documents documentation GitHub - daohu527/dig-into-apollo: Apollo notes (Apollo学习笔记) - Apollo l…...
森林消防新利器:高扬程水泵的革新与应用/恒峰智慧科技
随着全球气候变化的加剧,森林火灾的频发已成为威胁生态安全的重要问题。在森林消防工作中,高效、快速的水源供给设备显得尤为重要。近年来,高扬程水泵的广泛应用,为森林消防工作带来了新的希望与突破。 一、高扬程水泵的技术优势 …...
Microsoft Universal Print 与 SAP 集成教程
引言 从 SAP 环境打印是许多客户的要求。例如数据列表打印、批量打印或标签打印。此类生产和批量打印方案通常使用专用硬件、驱动程序和打印解决方案来解决。 Microsoft Universal Print 是一种基于云的打印解决方案,它允许组织以集中化的方式管理打印机和打印机驱…...
VBA在Excel中字母、数字的相互转化
VBA在Excel中字母、数字的相互转化 字母转数字的方法 数字转字母的方法 众所周知,Excel表中的行以数字展示,列用字母展示,如下图: 编程时,很多时候需要将列的字母转变为数字使用,如cells(num1,num2).value等,不知大家是怎么将字母转化为数字的,Excel是否有其他方式…...
【C语言】——联合体与枚举
【C语言】——联合体与枚举 一、联合体1.1、联合体类型的声明1.2、联合体的特点1.3、相同成员的结构体和联合体对比1.4、联合体的大小计算1.5、联合体的应用举例 二、枚举2.1、枚举类型的声明2.2、枚举类型的优点 一、联合体 1.1、联合体类型的声明 联合体也叫做共用体 与…...
java线上问题排查之内存分析(三)
java线上问题排查之内存分析 使用top命令 top命令显示的结果列表中,会看到%MEM这一列,这里可以看到你的进程可能对内存的使用率特别高。以查看正在运行的进程和系统负载信息,包括cpu负载、内存使用、各个进程所占系统资源等。 2.用jstat命令…...
中电金信:金Gien乐道 | 4月要闻速览,精彩再回顾
中国电子党组副书记、总经理李立功一行调研中电金信 4月10日,中国电子党组副书记、总经理李立功一行赴中电金信进行调研,深入听取了中电金信经营发展情况、研发工作及“源启”行业数字底座平台的汇报,并参观了公司展厅和科技研发场所…...
Java将文件目录转成树结构
在实际开发中经常会遇到返回树形结构的场景,特别是在处理文件系统或者是文件管理系统中。下面就介绍一下怎么将文件路径转成需要的树形结构。 在Java中,将List<String>转换成树状结构,需要定义一个树节点类(TreeNode&#…...
硬件工程师必读:10条职业发展黄金法则!
在快速发展的科技时代,硬件工程师作为推动技术创新和产业升级的重要力量,其职业发展之路既充满挑战也蕴含无限机遇。为了在这条道路上稳步前行,我们首先需要了解硬件产品的研发流程。 在这个过程中,公司内的每个岗位都发挥着不可或…...
Redis是什么? 日常运维 Redis 需要注意什么 ? 怎么降低Redis 内存使用 节省内存?
你的项目或许已经使用 Redis 很长时间了,但在使用过程中,你可能还会或多或少地遇到以下问题: 我的 Redis 内存为什么增长这么快?为什么我的 Redis 操作延迟变大了?如何降低 Redis 故障发生的频率?日常运维…...
【Android项目】“追茶到底”项目介绍
没有多的介绍,这里只是展示我的项目效果,后面会给出具体的代码实现。 一、用户模块 1、注册(第一次登陆的话需要先注册账号) 2、登陆(具有记住最近登录用户功能) 二、点单模块 1、展示饮品列表 2、双向联动…...
机试:进制转换问题
十进制转任意进制 简单回忆一下十进制我们是怎么转换成二进制的(短除法): 我们会将十进制数不断的进行除2操作,并且记录下每一次的余数(这个余数就是我们最终求的二进制数的组成部分)。 以下以12D举例&a…...
目标检测实战(十五): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
文章目录 一、目标检测介绍二、YOLOv7介绍三、源码/论文获取四、环境搭建4.1 环境检测 五、数据集准备六、 模型训练七、模型验证八、模型测试九、错误总结9.1 错误1-numpy jas mp attribute int9.2 错误2-测试代码未能跑出检测框9.3 错误3- Command git tag returned non-zero…...
github中fasttext库README官文文档翻译
参考链接:fastText/python/README.md at main facebookresearch/fastText (github.com) fastText模块介绍 fastText 是一个用于高效学习单词表述和句子分类的库。在本文档中,我们将介绍如何在 python 中使用 fastText。 环境要求 fastText 可在现代 …...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
