SpringAOP——基础知识
AOP
AOP全称是Aspect Oriented Programming 即面向切面编程,是对一类统一事务的集中处理
例如,我们的网页许多地方都需要进行登陆验证,这时就需要在很多地方添加重复的验证代码,而AOP可以集中配置需要登陆验证的地方,就可以简化我们的代码
除此以外还可以实现:
- 统一日志的记录
- 统一方法执行的时间记录
- 统一返回格式的设置
- 统一异常的处理
- 事务的开启和提交
springAOP
就像IoC是思想,而DI是实现,SpringAOP也是对AOP这种思想的实现
基本组成
- 切面:用来处理问题的一个类,包含切点和通知的相关方法
- 切点:用来设置拦截的规则
- 通知:程序拦截后进行的具体操作
- 连接点:触发AOP相关规则的点
其中对于通知,还有下面几种不同的分类:
- 前置通知: 使用@Before注解,在目标方法执行前执行
- 后置通知:使用@After注解,在目标方法返回或抛出异常后执行
- 返回通知:使用@AfterRetruning注解,在目标方法返回后执行
- 异常通知:使用@AfterThrowing注解,在目标方法抛出异常后执行
- 环绕通知:使用@Around注解,在包裹的方法执行前后执行后执行

也就是说,page1,2,3是需要验证是否登陆的页面,也就是连接点
验证是否登陆的这个方法就是切点
处理用户登陆问题是通知
而整个验证用户登陆的这个行为,称为切面
实现
首先在程序中加入SpringAOP的相关依赖
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-bo
ot-starter-aop -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
在程序中专门建一个类用来存储切面
@Aspect
@Component
public class 切面方法名{@Poiontcut("execution(修饰符 返回类型 包名.类名.方法名(参数) 异常)")public void 切点方法名(){}
}
其中Aspect注解代表此类是切面
而Component注解使该类在运行时启动
这里的切点方法并没有具体的实现,只是用来为通知方法标明执行的是那个切点
而@Pointcut注解后面的表达式则是标明拦截的规则
并且,表达式中还支持通配符:
- *匹配任意字符,只匹配一个元素
- …匹配任意字符,匹配多个元素
- +匹配指定类及其子类
也就是说:
修饰符
| 例子 | 表达 |
|---|---|
| public | 匹配所有公共方法 |
| * | 匹配所有方法 |
返回值(不能省略)
| 例子 | 表达 |
|---|---|
| String | 匹配所有返回String的方法 |
| * | 匹配所有方法 |
包名
| 例子 | 表达 |
|---|---|
| com.example.demo | 匹配com.exaple.demo这个包 |
| com.*.demo | 匹配前面是com,结尾是demo的包 |
| com.demo… | 匹配com下面的所有子包 |
类名
| 例子 | 表达 |
|---|---|
| User | 匹配User类 |
| User* | 匹配以User开头的类 |
| * | 匹配所有类 |
方法名(不能省略)
| 例子 | 表达 |
|---|---|
| getUser | 匹配getUser这个方法 |
| *getUser | 匹配以getUser结尾的方法 |
| * | 匹配所有方法 |
参数
| 例子 | 表达 |
|---|---|
| () | 匹配没有参数的方法 |
| (int, float) | 匹配一个int,一个float参数的方法 |
| (…) | 匹配任意类型的参数 |
例如:
定义一个匹配com.example.demo.controller包下,UserController的任意方法
@Component //随框架启动而启动
@Aspect //切面类
public class UserAspect {/*** 定义切点*/@Pointcut("execution(* com.example.demo.controller.UserController.*(..))")public void pointcut(){}
}
实现通知
前置通知
/*** 前置通知*/
@Before("pointcut()")
public void beforeAdvice(){System.out.println("执行前置通知");
}
后置通知
/*** 后置通知*/
@After("pointcut()")
public void afterAdvice(){System.out.println("执行后置通知");
}
环绕通知
/*** 环绕通知*/
@Around("pointcut()")
public Object aroundAdvice(ProceedingJoinPoint joinPoint){System.out.println("进入环绕通知");Object object = null;try{//执行拦截方法object = joinPoint.proceed();} catch (Throwable e) {e.printStackTrace();}System.out.println("结束环绕通知");return object;
}
返回通知
@AfterReturning("pointcut()")
public void returnAdvice(){System.out.println("执行返回通知");
}
异常通知
@AfterThrowing("pointcut()")
public void throwAdvice(){System.out.println("执行抛出异常通知");
}
把UserController类定义出来,验证一下这些通知是否执行
@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/hi")public String sayHi(String name){System.out.println("执行sayHi方法");return "hi" + name;}@RequestMapping("/hello")public String sayHello(){System.out.println("执行sayHello方法");return "hello world";}
}
在访问127.0.0.1:8080/user/hi页面时,程序台就会打印如下信息

实现原理
springAOP只支持方法级别的拦截,这是因为其基于动态代理实现
其中分别用JDK Proxy(实现接口的类生成代理类),和CGLIB(没实现接口的类生产代理类)
把切面连接到目标对象的相关位置(连接点)的行为叫织入
其中一般在目标对象的这几个时期织入
- 编译器
- 类加载期
- 代码运行期(SpringAOP实现方式)
相关文章:
SpringAOP——基础知识
AOP AOP全称是Aspect Oriented Programming 即面向切面编程,是对一类统一事务的集中处理 例如,我们的网页许多地方都需要进行登陆验证,这时就需要在很多地方添加重复的验证代码,而AOP可以集中配置需要登陆验证的地方,…...
kafka3.0安装使用
一:定义 Kafka传 统定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 Kafka最 新定义 : Kafka是 一个开源的 分 布式事件流平台 (Event St…...
Centos7(阿里云)_安装Mysql8.0
1.安装MySQL 新人可以试用一个月的阿里云,centos7的 一开始可能确实会自带mariadb,所以可以在网上随便找个教程开始尝试安装MySQL,当然大概率出错,然后此时你的rpm下面已经有了一个版本的mysql安装包。 以我为例,随便…...
【Java】JVM
一、介绍 1.什么是JVM? JVM是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。JVM包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。JVM屏…...
Linux 和数据库笔记-06
今日内容介绍全天内容无需立马掌握MySQL 的高级功能应用数据库设计ER模型定义: E 代表实体(数据表), R 代表联系(数据表之间对应的字段)关系常见分类一对一一对多多对多外键如果…...
MySQL面试题-事务篇
1.事务的特性(ACID) 事务(Transaction)是指一组操作被看作是一个不可分割的工作单元,这组操作要么全部执行成功,要么全部执行失败。事务的特性通常用 ACID 四个单词来描述,它们分别代表原子性&…...
Linux嵌入式开发 | 汇编驱动LED(1)
文章目录🚗 🚗Linux嵌入式开发 | 汇编驱动LED(1)🚗 🚗初始化IO🚗 🚗STM32🚗 🚗使能GPIO时钟🚗 🚗设置IO复用🚗 Ƕ…...
什么是EventLoop?怎么测试Node或页面的性能
Event Loop 机制大家应该都有了解。本文利用 EventLoop 去做一个有趣的检测node或页面性能的代码,顺便介绍了一下EventLoop,希望对大家有所帮助! Event Loop Event Loop 机制大家应该都有了解。我先重复总结一下。 Node.js 和 Javascript 的…...
1018 锤子剪刀布 1025 反转链表
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。 输入格式: 输入第 1 行给出正整数 N(≤10 5 ),即双方交锋的次数。随后 N 行,每行给出一次交锋的信…...
卷积神经网络的原理及实现
专栏:神经网络复现目录 卷积神经网络 本章介绍的卷积神经网络(convolutional neural network,CNN)是一类强大的、为处理图像数据而设计的神经网络。 基于卷积神经网络架构的模型在计算机视觉领域中已经占主导地位,当今…...
【C++知识点】重载
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…...
apscheduler三种定时触发方式
#第一种# date: 特定的时间点触发# 2019-01-01 00:00:00 准时执行# import time # from apscheduler.schedulers.blocking import BlockingScheduler # # def my_job(): # print(time.strftime(%Y-%m-%d %H:%M:%S, time.localtime(time.time()))) # sched BlockingSchedu…...
802.11 service服务类型
802.11 serviceservice定义service分类按照模块分为两类按照功能分为六类数据传输相关服务分布式服务DS(Distribution Service)整合服务IS(Integration Service)关联(association)重关联(reasso…...
pytest测试框架——allure报告
文章目录一、allure的介绍二、allure的运行方式三、allure报告的生成方式一、在线报告、会直接打开默认浏览器展示当前报告方式二、静态资源文件报告(带index.html、css、js等文件),需要将报告布置到web服务器上。四、allure中装饰器1、实现给…...
SQLI-Labs(3)8-14关【布尔盲注和时间盲注】
目录 第八关 第九关: 第十关 第十一关 第十二关 第十三关 第十四关 第八关 我们用测试语句来测试是否为注入点 从上图中得知存在注入点,那么接下来就是爆列 一共有三列,接下来用union select 和报错注入都试一下发现没有回显点&…...
ESP32学习笔记03-日志打印
ESP32日志 日志分为5个等级 ESP_LOGE - error (lowest)ESP_LOGW - warningESP_LOGI - infoESP_LOGD - debugESP_LOGV - verbose (highest)API 0.头文件 #include "esp_log.h"1.给一个日志标签设置等级...
mongoTemplate非string类型模糊查询
需求 为方便使用人员对任务Task的搜索,需要根据number实现模糊搜索。 背景 之前设计的number是long类型,但是mongodb只支持string类型的正则匹配。 方案 修改number为string类型;新增一个冗余字段,用于模糊查询;在…...
Redis是单线程还是多线程?Redis的10种数据类型,有哪些应用场景?
目录专栏导读一、同样是缓存,用map不行吗?二、Redis为什么是单线程的?三、Redis真的是单线程的吗?四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…...
到底什么才是幻读?
💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…...
RPC重试机制和控制方案
重试机制 因为网络抖动等原因导致 RPC 调用失败,这时候使用重试机制可以提高请求的最终成功率,减少故障影响,让系统运行更稳定。 重试简易实现方案 在重试的过程中,为了能够在约定的时间内进行安全可靠地重试,在每次…...
Ostrakon-VL-8B对比评测:主流开源多模态模型在餐饮场景的较量
Ostrakon-VL-8B对比评测:主流开源多模态模型在餐饮场景的较量 最近在餐饮和零售行业,用AI来“看懂”图片的需求越来越多了。比如,自动识别菜品、分析菜单、甚至根据顾客拍的模糊照片推荐相似菜品。这背后,多模态模型是关键。 市…...
2025届学术党必备的十大降AI率助手实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网 AI 检测系统借助对文本的分析来生成逻辑以及进行语言模式识别,以此识别机器…...
AD7193高精度ADC驱动设计与嵌入式集成实践
1. PRDC_AD7193 库概述:面向高精度测量的 AD7193 嵌入式驱动设计与工程实践AD7193 是 Analog Devices(ADI)推出的一款专为高精度、低噪声测量场景优化的 Σ-Δ 型 24 位模数转换器(ADC)。其核心特性包括:集…...
MCP + A2A:正在重塑 AI 世界的两个关键协议
MCP A2A:正在重塑 AI 世界的两个关键协议 2026年,AI 智能体(Agent)的竞争已经从"谁的模型更强",转向了"谁的智能体更能协作"。而支撑这场协作革命的底层基础设施,正是两个看似低调却极…...
光伏并网发电系统最大功率点跟踪(MPPT)技术研究
光伏并网发电系统最大功率点跟踪(MPPT)技术研究 第一章 绪论 1.1 研究背景与意义 随着全球能源危机和环境污染问题的日益严峻,太阳能作为一种取之不尽、用之不竭的清洁能源,受到了广泛关注。光伏并网发电系统已成为太阳能利用的主要形式。然而,光伏电池的光电转换效率较…...
告别ArcGIS依赖!用QGIS 3.28把SHP属性表一键导出Excel,附赠3个数据清洗小技巧
告别ArcGIS依赖!用QGIS 3.28高效导出SHP属性表到Excel的完整指南 当你在处理地理空间数据时,是否曾因ArcGIS的复杂操作或高昂成本而感到困扰?QGIS作为一款开源GIS软件,不仅完全免费,还能轻松完成从基础到高级的空间数据…...
别急着重装!Stable Diffusion WebUI安装失败后,如何利用现有文件快速恢复(Mac/Windows通用)
别急着重装!Stable Diffusion WebUI安装失败后,如何利用现有文件快速恢复(Mac/Windows通用) 当你兴致勃勃地准备体验Stable Diffusion WebUI的强大功能时,突然在安装过程中遇到错误提示,那种挫败感可想而知…...
深入解析LCD面板Gamma校准:从原理到自动化调试实践
1. Gamma校准的前世今生:从CRT到LCD的视觉革命 第一次接触Gamma校准时,我正对着两台显示器发愣——同样的设计稿在CRT显示器上色彩饱满,到了LCD屏幕却像蒙了层灰。这个困扰无数设计师的问题,背后正是Gamma值在作祟。早年的CRT显示…...
如何通过GitHub配置Resume简历:无需代码的终极解决方案
如何通过GitHub配置Resume简历:无需代码的终极解决方案 【免费下载链接】resume 🚀 在线简历生成器 项目地址: https://gitcode.com/gh_mirrors/resu/resume Resume是一款功能强大的在线简历生成器,让你无需编写代码即可轻松创建专业简…...
告别硬编码!用Rule-Engine 1.0.0重构你的Java业务逻辑(附订单折扣实战)
告别硬编码!用Rule-Engine 1.0.0重构你的Java业务逻辑(附订单折扣实战) 每次电商大促前夜,技术团队最怕听到的一句话是什么?"折扣规则又改了!"——这往往意味着通宵修改代码、紧急测试和冒着风险…...
