面向切面编程的魔法 ---【Spring AOP】

目录

什么是AOP?

 什么是Spring AOP?

Spring AOP 的实现

1. 引入依赖

2. 实现切面逻辑

概念理解


在软件开发中,面向切面编程(AOP)是一种强大的编程范式,它允许我们在应用程序的不同模块中提取横切关注点,而不是将它们分散到各个模块中。Spring 框架为 Java 开发者提供了一套强大的 AOP 工具,通过 Spring AOP,我们能够更加优雅地解决横切关注点的问题。

什么是AOP?

其实AOP就是一种思想,对某一类事情(切面)的集中处理。

大家想要更深的了解 面向切面编程(AOP)与 面向对象编程(OOP)可以看这个文章:

AOP与OOPicon-default.png?t=N7T8http://t.csdnimg.cn/0FxBR


 什么是Spring AOP?

AOP是⼀种思想, 它的实现⽅法有很多, 有Spring AOP,也有AspectJ、CGLIB等. Spring AOP是其中的⼀种实现⽅式.

Spring AOP是Spring框架的一个关键特性,它提供了一种方式来使应用程序的横切关注点(如日志、事务管理、安全性等)与核心业务逻辑相分离。

通过AOP,我们可以将这些关注点定义为切面,并将它们应用于应用程序的不同模块,而不是在每个模块中重复相同的代码。

假设当前有一个常场景:现在我们要观察一个方法(接口)的响应时间。

正常是出方法的时间 - 写入方法的时间

但是如果业务逻辑里再调用其他方法呢?调用的方法也调用其他方法呢?这样的话不就是同一类事情 mo,AOP 就能对此进行处理!!!

Spring AOP 的实现
1. 引入依赖

在项目的 pom.xml 引入依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 实现切面逻辑

具体每一步标记在代码上

@Slf4j  // 打印日志
@Aspect // 实现 AOP
@Component // 交给 Spring 管理
public class TimeRecordAspect {// 对哪些方法生效 第一个 * 是指 controller 包下的所有类,第二个指所有方法@Around("execution(* com.lpy.book.controller.*.*(..))") public Object record(ProceedingJoinPoint pj) throws Throwable {/** 切面逻辑:*  1. 记录开始时间*  2. 执行目标方法*  3. 记录结束时间*  4. 记录消耗时间*/// 1.long start = System.currentTimeMillis();// 2.Object result = pj.proceed();// 3.long end = System.currentTimeMillis();// 4./** pj.getSignature() : 上面路径中的方法*/log.info(pj.getSignature() + "cost time: " + (end - start) + "ms");return result;}}
概念理解

切面(Aspect): 切面是一组通知和切点的组合。通知定义了在何时、何地执行的代码,而切点定义了在应用程序中的哪些位置执行这些通知。

通知(Advice): 通知是在切面的特定切点上执行的代码。Spring AOP 提供了五种类型的通知:

@Before 前置通知)此注解标注的通知⽅法在⽬标⽅法前被执⾏
@After (后置通知)此注解标注的通知⽅法在⽬标⽅法后被执⾏, ⽆论是否有异常都会执⾏
@AfterReturning (返回后通知)此注解标注的通知⽅法在⽬标⽅法后被执⾏, 有异常不会执⾏
@AfterThrowing (异常后通知)此注解标注的通知⽅法发⽣异常后执⾏
@Around(环绕通知)此注解标注的通知⽅法在⽬标⽅法前, 后都被执⾏

切点(Pointcut): 切点是在应用程序中定义的一个或多个连接点的集合。通知将在这些连接点上执行。

连接点(Join Point): 连接点是在应用程序执行过程中可以插入切面的点。例如,方法的调用是一个连接点。

引入(Introduction): 引入允许我们向现有的类添加新方法或属性,而无需修改它们的源代码。

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

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

相关文章

微信网页授权之使用完整服务解决方案

目录 微信网页授权能力调整造成的问题 能力调整的内容和理由 原有运行方案 is_snapshotuser字段 改造原有方案 如何复现测试场景 小结 微信网页授权能力调整造成的问题 依附于第三方的开发&#xff0c;做为开发者经常会遇到第三方进行规范和开发的调整&#xff0c;如开…

线程池,定时器以及阻塞队列(生产者/消费者模型)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录专栏&#xff1a;线程池,定时器以及阻塞队列(生产者/消费者模型) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 实现线程池,定时器以及阻塞队列,生产者/消费者模型 线程池线程池…

Linux------进程优先级与进程切换

目录 一、进程优先级 二、优先级与权限的区别 三、优先级的查看 四、进程优先级修改 五、进程切换 六、linux2.6内核调度队列与调度原理 一、进程优先级 首先我们得知道一个进程总是需要排队的&#xff0c;他一会在运行队列中排队等待运行&#xff0c;一会在设备的等待队…

【AcWing第141场周赛】AcWing 5464. 客人数量(A题)

文章目录 一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 一、题目 1、原题链接 5464. 客人数量 2、题目描述 二、解题报告 1、思路分析 按题意模拟&#xff0c;累加求和即可&#xff0c;最终输出结果。 2、时间复杂度 时间复杂度为O(n…

git命令远程仓库推送本地项目报错了,解决方案

如果你在使用git命令上传本地项目到远程仓库遇到了如下错误&#xff1a; Updates were rejected because the tip of your current branch is behind。n 别慌&#xff0c;肯定是你的远程仓库里面有原始文件&#xff0c;需要你提前进行一下合并操作&#xff0c;然后才能使用pu…

ES高可用架构涉及常用功能整理

ES高可用架构涉及常用功能整理 1. es的高可用系统架构和相关组件2. es的核心参数2.1 常规配置2.2 特殊优化配置2.2.1 数据分片按ip打散2.2.2 数据分片机架感知2.2.3 强制要求数据分片机架感知2.2.4 写入线程池优化2.2.5 分片balance优化2.2.6 限流控制器优化 3. es常用命令3.1 …

用Python Tkinter打造的精彩连连看小游戏【附源码】

文章目录 连连看小游戏&#xff1a;用Python Tkinter打造的精彩游戏体验游戏简介技术背景MainWindow类:职责:方法:Point类: 主执行部分:完整代码&#xff1a;总结&#xff1a; 连连看小游戏&#xff1a;用Python Tkinter打造的精彩游戏体验 在丰富多彩的游戏世界中&#xff0c…

【C++】C++入门 — 类和对象初步介绍

类和对象 1 类的作用域2 类的实例化3 类对象模型4 this指针介绍&#xff1a;特性&#xff1a; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 类的作用域 类定义了一个新的作用域&#xff0c;类的…

超级实用!Android Studio的10大神器插件,让你的开发效率翻倍!

超级实用&#xff01;Android Studio的10大神器插件&#xff0c;让你的开发效率翻倍&#xff01; Android Studio是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Android应用程序开发而设计。它提供了丰富的工具和功能&#xff0c;使开发者能够轻松…

vulhub中Adminer远程文件读取漏洞复现(CVE-2021-43008)

Adminer是一个PHP编写的开源数据库管理工具&#xff0c;支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL、Oracle、Elasticsearch、MongoDB等数据库。 在其版本1.12.0到4.6.2之间存在一处因为MySQL LOAD DATA LOCAL导致的文件读取漏洞。 参考链接&#xff1a; https://gith…

Jenkins(本地Windows上搭建)上传 Pipeline构建前端项目并将生成dist文件夹上传至指定服务器

下载安装jdk https://www.oracle.com/cn/java/technologies/downloads/#jdk21-windows 下载jenkins window版 双击安装 https://www.jenkins.io/download/thank-you-downloading-windows-installer-stable/ 网页输入 http://localhost:8088/ 输入密码、设置账号、安装推…