Spring AOP归纳与总结

前言

AOP的核心思想是面向切面编程。AOP规范定义了多种概念,常用的aop框架有spring aop和AspectJ,两者功能和性能差异较大,现在默认的AOP框架是AspectJ,下面逐渐归纳其相关概念、功能及实现原理。

1. 概念

1. 切面: 通常为一个具体的实体类,用@Aspect标注,代表由一个或多个切点组成的切面,因为可以由多个切点,所以一个切面类它可以是多维度、多条件的。
2. 切点:即@PointCut,它是由一个或者多个条件形成的切入点
3. 连接点: 连接点,ProceedingJoinPoint, 即满足切点条件后,每个请求具体在某个类、某个方法上的连接点,因此连接点是请求级的,每个请求的连接点可能都不一样。

2. 切面创建

切面通常代表一个具体的实体类,用@Aspect标注,除此之外,在spring中,还需要将该类用@Component标注为一个实体。

3. 切点定义

切点是由一个或者多个条件组成的,这里面有两个元素:条件表达式和条件逻辑连接

条件的逻辑连接及常用的与&& 、 或|| 、非!,可以通过括号()等来确定。不同类型的条件表达式可以通过逻辑符号连接。

而条件表达式可以聚焦不同的维度来编写, 下面以全路径为com.example.demo.controller.TestController的类来举例:

1. 目标对象(target)
@Pointcut("target(com.example.demo.controller.TestController)")
public void pointCut(){}

在target表达式中,需要用类的全路径。针对这个类中所有接口。

2. IOC对象(bean)
@Pointcut("bean(testController)")
public void pointCut(){}

在bean的表达式中,需要用IOC容器名称。针对这个bean对象中的所有接口。

3. 方法级(execution)
@Pointcut("execution(* com.example.demo.controller.TestController(*.*))")
public void pointCut(){}
4. 方法级(@annotation)

自定义一个注解com.example.demo.controller.Ts,并在测试类的方法上添加该注解。

@Pointcut("@annotation(com.example.demo.controller.Ts)")
public void pointCut(){}
5. 其他

除了上述几种条件表达式外,还有其他表达式如args、within等等。

3. 通知类型

通知类型有5种,@Before前置通知@Around环绕通知、@AfterReturn响应后通知、@AfterThrowing异常后通知、@After后置通知。
当有多个通知类型时的优先级顺序。下面还是以TestController的这个切点来举例,并且添加所有的通知类型,其中环绕通知执行joinPoint.proceed();并前后打点。

结果如下:
在这里插入图片描述
由此可知,当有@Around环绕通知时,先进入@Around环绕通知,最后退出@Around环绕通知。

Around前置 > Before > 业务接口 >AfterReturn(AfterThrowing) > After > Around后置

Before 前置通知

前置通知通常用于做进入连接点前的验证或者拦截,强调在业务之前做增强处理。

AfterReturn 正常响应通知

该通知用于在业务接口正常响应以后,做增强处理。

AfterThrowing 异常响应通知

该通知用于在业务接口异常响应后,做增强处理。

后置通知

该通知在AfterReturn 或 AfterThrowing后,不论是否正常还是异常响应,都会经过。可以做后置强制处理。

环绕通知

环绕通知需要引入连接点,ProceedingJoinPoint joinPoint,具体的业务在joinPoint.proceed();过程中执行。前置和后置通知可以在该代码块前后处理。

4. 原理实现

代理分为静态代理和动态代理,动态代理又分为JDK动态代理和Cglib动态代理。
其中,JDK动态代理是java原生api,需要被代理类有接口实现,所以JDK动态代理又称为接口代理。
Cglib动态代理不需要实现接口,又称为子类代理,不需要额外的接口实现。

1. JDK动态代理
2. Cglib动态代理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/161197.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学习 Java:简单易懂的入门指南之线程池(三十六)

线程池 1.1 线程状态介绍1.2 线程池-基本原理1.3 线程池-Executors默认线程池1.4 线程池-Executors创建指定上限的线程池1.5 线程池-ThreadPoolExecutor1.6 线程池-参数详解1.7 线程池-非默认任务拒绝策略 1.1 线程状态介绍 当线程被创建并启动以后,它既不是一启动…

linux文件权限与目录配置

用户与用户组 linux一般将文件可读写的身份分为三个类别:拥有者(owner)、所属群组(group)、其他人(other) 三种身份都有读、写、执行等权限 文件拥有者 linux是个多人多任务的系统&#xff0c…

论文解析-moETM

论文解析-moETM 参考亮点动机发展现状现存问题 功能方法Encoder改进Decoder改进 评价指标生物保守性批次效应移除 实验设置结果多组学数据整合cell-topic mixture可解释性组学翻译性能评估RNA转录本、表面蛋白、染色质可及域调控关系研究1. 验证同一主题下,top gene…

什么是NetApp的DQP和如何安装DQP?

首先看看什么是DQP,DQPDisk Qualification Package,文字翻译就是磁盘验证包。按照NetApp的最佳实践,要定期升级DQP包,保证对最新磁盘和磁盘扩展柜的兼容。 本文主要介绍7-mode下如何升级DQP,至于cluster mode另外文章…

NewStarCTF2023week2-Upload again!

尝试传修改后缀的普通一句话木马&#xff0c;被检测 尝试传配置文件 .htaccess 和 .user.ini 两个都传成功了 接下来继续传入经过修改的木马 GIF89a <script language"php"> eval($_POST[cmd]); </script> 没有被检测&#xff0c;成功绕过 直接上蚁剑…

圣树唤歌最强阵容2023,圣树唤歌阵容推荐

无疑圣树唤歌作为一款备受欢迎的手机游戏&#xff0c;其深刻的战斗系统一直以来都受到大家的追捧。在这个虚拟世界中胜利的关键在于组建一支无懈可击的强大队伍&#xff0c;要想成为强者&#xff0c;就必须拥有最强阵容。 关注【娱乐天梯】&#xff0c;获取内部福利号 在本篇攻…

C++项目实战——基于多设计模式下的同步异步日志系统(总集篇)

文章目录 专栏导读项目介绍开发环境核心技术环境搭建日志系统介绍1.为什么需要日志系统2.日志系统技术实现2.1同步写日志2.2异步写日志 前置知识补充不定参函数C风格不定参函数不定参宏函数设计模式六大原则单例模式饿汉模式懒汉模式 工厂模式简单工厂模式工厂方法模式抽象工厂…

Linux:mongodb数据逻辑备份与恢复(3.4.5版本)

我在数据库aaa的里创建了一个名为tarro的集合&#xff0c;其中有三条数据 备份语法 mongodump –h server_ip –d database_name –o dbdirectory 恢复语法 mongorestore -d database_name --dirdbdirectory 备份 现在我要将aaa.tarro进行备份 mongodump --host 192.168.254…

攻防演练蓝队|Windows应急响应入侵排查

文章目录 日志分析web日志windows系统日志 文件排查进程排查新增、隐藏账号排查启动项/服务/计划任务排查工具 日志分析 web日志 dirpro扫描目录&#xff0c;sqlmap扫描dvwa Python dirpro -u http://192.168.52.129 -b sqlmap -u "http://192.168.52.129/dvwa/vulnera…

Jmeter接口测试:jmeter导入和导出接口的处理

JMeter测试导入接口 利用Jmeter测试上传文件&#xff0c;首先可根据接口文档或者fiddler抓包分析文件上传的接口&#xff1b;如下图&#xff1a; 以下是我通过fiddler所截取的文件上传的接口 1、填写导入接口的信息 查看文件上传栏下的填写信息&#xff1a; 文件名称&#x…

Unity中Shader的深度写入ZWrite

文章目录 前言一、更新深度缓冲区中值二、深度值的写入操作只有两个选择 开启 和 关闭ZWrite OnZWrite Off 三、深度写入在半透明物体物体中开启的情况1、特效一般都需要关闭深度写入2、如果在人物模型上使用 特效半透明 的 Shader&#xff0c;为了不出现模型自身穿透问题&…

Web3D虚拟人制作简明指南

如何在线创建虚拟人? 虚拟人,也称为数字化身、虚拟助理或虚拟代理,是一种可以通过各种在线平台与用户进行逼真交互的人工智能人。 在线创建虚拟人变得越来越流行,因为它为个人和企业带来了许多好处。 通过虚拟助理或代理,您可以以更具吸引力和个性化的方式与客户或受众进…

146.LRU缓存

双向链表哈希表 class LRUCache { public://1、定义双向链表结构、容量、哈希表等LRU数据成员struct Node{int key,value;Node *left,*right;Node(int _key,int _value):key(_key),value(_value),left(NULL),right(NULL){}}*L,*R;int n;unordered_map<int,Node*> ump;//…

李航:关于大模型的思考及研究热点

本文阐述李航老师对 LLM 的一些看法&#xff0c;主要观点如下&#xff1a; ChatGPT 的突破主要在于规模带来的质变和模型调教方式的发明。 LLM 融合了实现人工智能的三条路径。 LLM 的开发需要结合第三者体验和第一者体验。 LLM 能近似生成心智语言。 LLM 需要与多模态大模…

SamSung三星笔记本NP930QCG-K02CN原装出厂OEM预装Win10系统

下载链接&#xff1a;https://pan.baidu.com/s/13GsR_r9caJkLjiWWaXa30Q?pwdncp9 系统自带指纹驱动、声卡,网卡,显卡等所有驱动、三星出厂时主题壁纸、系统属性三星专属LOGO标志、Office办公软件等三星出厂时自带的预装程序 由于时间关系,绝大部分资料没有上传&#xff0c;不…

Unity之ShaderGraph如何实现上下溶解

前言 我们经常在电影中见到的一个物体或者人物&#xff0c;从头上到脚下&#xff0c;慢慢消失的效果&#xff0c;我么今天就来体验一下这个上下溶解。 主要节点 Position节点&#xff1a;提供对网格顶点或片段的Position 的访问 Step节点&#xff1a;如果输入In的值大于或…

双目视觉实战--相机几何

目录 一、针孔摄像机和透镜 1. 针孔摄像机的原理 2. 近轴折射模型 3. 镜头畸变问题 二、摄像机几何 1. 数学基础 2. 相机坐标系&#xff08;空间点&#xff09;→像素坐标系的映射关系&#xff1a; 3. 规范化投影变换 4. 投影变换的性质 三、其他摄像机模型 1. 弱透视…

新时代高效记账:自动化智能如何进行财务管理

随着科技的不断发展&#xff0c;自动化智能已经逐渐渗透到我们生活的各个领域。在财务管理中&#xff0c;自动化智能的应用显得尤为重要。它不仅可以提高财务管理的效率和精度&#xff0c;还能帮助我们更好地规划和掌控公司的财务状况 晨曦记账本提供了多种高效财务管理工具。…

【MultiOTP】Docker安裝MultiOTP, 让Windows登入更安全(MFA)

序 在当前数字时代&#xff0c;网络安全成为了一个非常重要的话题。随着越来越多的人和组织依赖于计算机系统来进行工作和存储敏感信息&#xff0c;确保身份验证安全变得至关重要。双因素身份验证&#xff08;2FA&#xff09;是一种强大的安全措施&#xff0c;可在传统的用户名…

设计模式截图记录

设计模式截图记录