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 可在现代 …...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...