【Java】SpringAOP —— AOP是什么? 代码实现了SpringAOP

文章目录

  • 一、AOP是什么
  • 二、AOP的组成
  • 三、SpringAOP
  • 四、实现SpringAOP
    • 1.添加AOP框架支持
    • 2.定义切面切点
    • 3.定义相关通知
  • 总结


一、AOP是什么

AOP(Aspect Oriented Programming):面向切面编程,它是⼀种思想,它是对某一类事情的集中处理。

就比如用户登录验证,一个网站的绝大部分功能,都要验证用户是否登录,因此就要在大多数功能中添加用户登录验证的代码或调用用户登录验证的方法,这是相当繁琐的,后期的开发维护成本也很高。

而AOP则可以解决这一问题。

对于这种功能统一,且频繁使用的功能,就可以使用AOP来统一处理了。


二、AOP的组成

  1. 切面(Aspect):由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包
    括了连接点的定义。
  2. 连接点(Join Point):程序执行中可以插入切面的一个点,可以是方法调用时,抛出异常时等等。
  3. 切点(Pointcut):Pointcut 的作用就是提供⼀组规则(使用 AspectJ pointcut expression language 来描述)来匹配 Join Point,给满足规则的 连接点 添加 通知。
  4. 通知(Advice):切面也是有目标的 ——它必须完成的工作。在 AOP 术语中,切面的工作被称之为通知。通知定义了切面是什么,何时使用,其描述了切面要完成的⼯作,还解决何时执行这个工作的问题。

切面就相当于加工厂,连接点是公司的待加工物品,切点是规定那些物品可以进行加工,通知则是加工这些物品


三、SpringAOP

Spring 切面类中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后会通知本方法进行调用:

  • 前置通知使用 @Before:通知方法会在目标方法调用之前执行。
  • 后置通知使用 @After:通知方法会在目标方法返回或者抛出异常后调用。
  • 返回之后通知使用 @AfterReturning:通知方法会在目标方法返回后调用。
  • 抛异常后通知使用 @AfterThrowing:通知方法会在目标方法抛出异常后调用。
  • 环绕通知使用 @Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执
    行⾃定义的行为。

切点表达式说明:
AspectJ 支持三种通配符
* :匹配任意字符,只匹配⼀个元素(包,类,或方法,方法参数)
.. :匹配任意字符,可以匹配多个元素 ,在表示类时,必须和 * 联合使⽤。
+ \ :表示按照类型匹配指定类的所有类,必须跟在类名后面,如com.cad.Car+ ,表示继承该类的所有子类包括本身
切点表达式由切点函数组成,其中 execution() 是最常用的切点函数,用来匹配方法,语法为:

execution(<修饰符><返回类型><包.类.方法(参数)><异常>)
修饰符与异常一般省略

返回值:{void}无返回,{String}返回字符串,{*}任意

:{com.example.demo} 固定包demo包; {com.example.demo.*} demo包下任意包不包括demo包;{com.example.demo..}demo包下任意包 包括demo包;

: {Demo}固定类Demo类;{de*}以De开头的类;{*mo}以mo结尾的类;{*}任意类

方法名:{function}固定方法function方法;{fun*}以fun开头的方法;{*tion}以tion结尾的方法;{*}任意方法

参数:{}无参;{int} 一个整型参数;{int,int}两个整型参数;{..}任意参数


四、实现SpringAOP

1.添加AOP框架支持

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2.定义切面切点

匹配方法的规则可以有多个,即可以有多个切点,切点方法不需要有方法体,只是需要这个方法名起一个标识作用.

@Aspect // 定义切面
@Component
public class UserAspect {// 切点@Pointcut("execution(* com.example.demo.Controller.UserController.*(..))")public void pointcutA(){}// 切点@Pointcut("execution(* com.example.demo.Controller.ArticleController.*(..))")public void pointcutB(){}

3.定义相关通知

通过注解来让方法变为通知方法,注解中填写切点的方法名来区分不同切点

@Aspect // 定义切面
@Component
public class UserAspect {// 切点@Pointcut("execution(* com.example.demo.Controller.UserController.*(..))")public void pointcutA(){}// 切点@Pointcut("execution(* com.example.demo.Controller.ArticleController.*(..))")public void pointcutB(){}@Before("pointcutA()")public void doBefore() {System.out.println("执行了前置通知");}@After("pointcutA()")public void doAfter() {System.out.println("执行了后置通知");}@Around("pointcutA()")public Object doAround(ProceedingJoinPoint joinPoint) {System.out.println("环绕通知开始执行");// 执行目标方法Object result = null;try {result = joinPoint.proceed();} catch (Throwable e) {e.printStackTrace();}System.out.println("环绕通知执行完毕");return result;}@AfterReturning("pointcutA()")public void doAfterReturning() {System.out.println("执行了返回后通知");}@AfterThrowing("pointcutA()")public void doAfterThrowing() {System.out.println("抛出异常后通知");}
}

在这里插入图片描述
其中do getUser为连接点的输出内容在这里插入图片描述


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

相关文章

Sophon AutoCV推动AI应用从模型生产到高效落地

随着技术市场和应用方向的逐渐成熟&#xff0c;人工智能与各行各业的结合和落地逐渐进入了深水区。 虽然由于行业规模化和应用普及度的限制&#xff0c;人工智能在“传统”行业的落地不如消费互联网行业&#xff0c;但是借助人工智能为“传统”行业的发展注入新能量一直是相关…

SAP EC-CS如何实现自动抵消

SAP EC-CS 是SAP 比较早的合并方案&#xff0c;尽管后面有很多其他的方案作为替代&#xff0c;但 EC-CS 因为其成熟性&#xff0c;在集团合并单元不多的情况下&#xff0c;也可以作为一个不错的合并解决方案。可以说&#xff0c;会计报表合并一个核心就是实现抵消的处理&#x…

Linux内核队列queue.h

文章目录 一、简介二、SLIST单向无尾链表2.1 介绍2.2 操作2.3 例子 三、STAILQ单向有尾链表四、LIST双向无尾链表五、TAILQ双向有尾链表六、CIRCLEQ循环链表七、queue源码参考 一、简介 queue.h是一个非常经典的文件&#xff0c;定义了一系列宏的操作&#xff0c;它定义了一系…

基于springboot的餐饮美食分享平台

任务书 1&#xff0e;问题描述 在21世纪的今天,互联网作为一种新兴媒介,正以蓬勃的姿态不断发展与完善.许多传统的线下行业也借助互联网这一平台,进一步推动商贸合作与沟通交流.传统美食行业也不例外,通过线上线下结合的方式为消费者提供服务,解决顾客对美食的需求.从古至今&…

DataX及Datax-web杂记

&#x1f47d;个人博客&#xff1a;https://everspring.github.io/ &#x1f47d;公众号&#xff1a;爱历史的IT男 一. DataX调试 DataX之前调试不是很方便&#xff0c;要打包后才能调试。23年7月后一位叫"FuYouJ "的开源者提交了datax-example模块&#xff0c;就方…

实例:NX二次开发收集关于Open C的计时信息

目录 一、概述 二、实现的功能 三、代码实现以及详细解析 一、概述 在NX二次开发过程中&#xff0c;我们为了效率经常会进行Open C的计时统计&#xff0c;这个实例可用于收集关于Open C的计时信息程序&#xff0c;并且在计时测试中很有用。该实例通过UF_begin_timer启动一个…

ARM系列 -- 虚拟化(一)

今天来研究一个有意思的话题&#xff0c;虚拟化&#xff08;virtualization&#xff09;。 开始前&#xff0c;先闲扯一下&#xff0c;最近一个词比较火&#xff0c;“元宇宙&#xff08;Metaverse&#xff09;”。在维基百科里面是这么定义元宇宙的&#xff0c;“The Metaver…

H3C IS-IS基本配置实验

H3C IS-IS基本配置实验 实验拓扑 ​​ 实验需求 按照图示配置IP地址按照图示分区域配置 IS-IS&#xff0c;完成全网互通&#xff0c;NET 地址如图所示要求 R1 和 R2/R3 只建立 Level-1 邻接关系要求 R2 和 R3 只建立 Level-1 邻接关系按照图示修改各链路 Cost在 R2 和 R3 上…

mysql8.0安装(zip版本)最详细

下载 https://dev.mysql.com/downloads/mysql/ 解压 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirD:\Atools\mysql-8.0.30-winx64 # 切记此处一定要用双斜杠\\&#xff0c;单斜杠我这里会出错&#xff0c;不过看别人的教程&#xff0c;有的是单斜杠。自己…

陶瓷工业5G智能制造工厂数字孪生可视化平台,推进行业数字化转型

陶瓷工业5G智能制造工厂数字孪生可视化平台&#xff0c;推进行业数字化转型。在陶瓷工业领域&#xff0c;5G智能制造工厂数字孪生可视化平台的应用正在改变着行业的传统生产模式&#xff0c;推动着数字化转型的进程。本文将围绕这一主题展开探讨&#xff0c;分析数字孪生可视化…

【数据结构】实现栈

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解栈&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一 .栈的概念及结构二 .栈的实现栈的结构体初始化销毁栈顶插入栈顶删除显示栈顶元素是否为空栈的大…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的行人车辆检测与计数(Python+PySide6界面+训练代码)

摘要&#xff1a;开发行人车辆检测与计数系统对于提升城市交通管理和监控系统的效率至关重要。本篇博客详细介绍了如何利用深度学习构建一个行人车辆检测与计数系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5…