Spring AOP:什么是AOP? 为什么要用AOP?如何学习AOP?

文章目录

  • 🎆前言
  • 1.为什么要用 AOP
  • 3.如何学习去 AOP?
    • 3.1 AOP 的组成
      • 切面(Aspect)
      • 连接点(Join Point)
      • 切点(Pointcut)
      • 通知(Advice)
  • 3. Spring AOP 实现
    • 3.1 普通的方式实现 AOP
    • 3.2 通过 @annotation 切断函数实现 AOP
    • 3.3 获取增强方法相关信息

🎆前言

学习一件新知识,我们首先要先了解它的概念;AOP(Aspect Oriented Programming):面向切面编程,它是⼀种思想,它是对某⼀类事情的集中处理。比如用户登录权限的校验,没有 AOP 之前,我们在所有需要判断用户登录的页面都进行调用用户验证的方法,而有了 AOP 之后,我们只需在一处配置好 AOP 规则,需要判断用户登录页面(还要接口)全部可以实现自主的登录验证,不再需要每次调用验证登录的方法,不但解决了每次调用验证方法的问题,还降低了代码的耦合性。
通俗的说,AOP就像一张网,会对某一个过程进行筛选,通过筛选的才能进行规定的操作,不通过的则会按照不通过的规则操作。
当然 AOP 是一种思想,而 Spring AOP 是一个框架,提供了 这个思想的实现方式。

1.为什么要用 AOP

还举上方那个例子,我们在处理用户登录验证时,每次验证都需要调用处理方法,随着我们项目的功能越来越多,而这些方法又相同,这么多的方法就会在代码修改和维护上使成本变高,对于这个问题,我们的处理方案就是:对功能统一的,且使用的地方较多的功能,就考虑使用 AOP 来统一处理。

AOP 可以实现的统一处理如下:

  • 统一日志记录
  • 统一方法执行时间统计
  • 统一返回格式设置
  • 统一的异常处理
  • 事务的开启和提交等

也就是说使⽤ AOP 可以扩充多个对象的某个能⼒,所以 AOP 可以说是 OOP(Object Oriented Programming,⾯向对象编程)的补充和完善。

3.如何学习去 AOP?

Spring AOP 学习主要分为以下 3 个部分:

  1. 学习 AOP 是如何组成的?也就是学习 AOP 组成的相关概念。
  2. 学习 Spring AOP 使⽤。
  3. 学习 Spring AOP 实现原理。

3.1 AOP 的组成

切面(Aspect)

切⾯(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包括了连接点的定义。通俗的说切面就是一个处理某个方面具体问题的类,类里包含了很多方法,这些方法就是通知、切点。

连接点(Join Point)

应⽤执行过程中能够插⼊切面的⼀个点,这个点可以是⽅法调⽤时,抛出异常时,甚⾄修改字段时。切⾯代码可以利⽤这些点插⼊到应⽤的正常流程之中,并添加新的行为。

切点(Pointcut)

切点 的作⽤就是提供⼀组规则(使⽤ AspectJ pointcut expression language 来描述)来匹配连接点,给满足规则的连接点添加通知。

通知(Advice)

切⾯也是有⽬标的 ——它必须完成的⼯作。在 AOP 术语中,切⾯的⼯作被称之为通知。
通知:程序被拦截请求触发后的具体动作。

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

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

AOP 整个组成部分的概念如下图所示,以多个⻚⾯都要访问⽤户登录权限为例:
没有使用AOP前,我们不调用登录验证方法,他就不会对用户登录进行验证,使用AOP后,当用户要使用某个需要登陆才有的功能时,AOP 就是根据配置好的文件自动验证是否登陆。
在这里插入图片描述

3. Spring AOP 实现

3.1 普通的方式实现 AOP

使用Spring AOP 来实现⼀下 AOP 的功能,完成的⽬标是拦截所有 UserController 里面的⽅法,每次调⽤ UserController 中任意⼀个⽅法时,都执⾏相应的通知事件。

Spring AOP 的实现步骤如下:

  1. 添加 Spring AOP 框架⽀持。
<!-- springboot-aop 技术 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 定义切面(创建切面类)
@Slf4j
@Component
@Aspect
public class MYAspect {@Pointcut("execution(* com.example.demo.controller.*.*(..))")public void put() {}@Before("put()")public void before() {log.error("方法被调用了");}
}
  1. 定义切点(配置拦截规则)
    写法:execution([修饰符] 返回类型 包名.类名.方法名(参数))
  • 修饰符:访问修饰符可以省略,大部分情况下省略
  • 返回类型:返回值类型、包名、类名、方法名可以使用星号 * 代表任意
  • 包名、类名:包名与类名之间一个点 代表当前包下的类,两个点代表当前包及齐子包下的类
  • 方法名(参数):参数列表可以使用两个点 表示任意个数,任意类型的参数列表
execution(* com.zzq.service.*.*(..)) // 表示com.zzq.service 包下任意类,方法名任意,参数列表任意,返回值类型任意
execution(* com.zzq.service.*..*(..)) // 表示 com.zzq.service 包及其子包下任意类,方法名任意,参数列表任意,返回值类型任意
execution(* com.zzq.service.*.*())   // 表示 com.zzq.service 包下任意类,方法名任意,要求方法不能有参数,返回值类型任意
execution(* com.zzq.service.*.delete*(..)) // 表示 com.zzq.service 包下任意类,要求方法不能有参数,返回值类型任意,方法名要求以 delete 开头 
  1. 定义通知
    @Before("put()")public void before() {log.error("方法被调用了");}

当我们调用 com.example.demo.controller 中的方法时,就会先执行通知里面的东西,再执行方法,如下图(这里为了能看的更清楚,我们用了日子打印信息)
在这里插入图片描述

3.2 通过 @annotation 切断函数实现 AOP

  1. 定义切面类
@Slf4j
@Component
@Aspect
public class MYAspect {@Pointcut("@annotation(com.example.demo.aspect.InvokeLog)")public void put() {}@Before("put()")public void before() {log.error("方法被调用了");}
}
  1. 定义切点
    切点函数扫描位置是我们下面定义注解的位置
 @Pointcut("@annotation(com.example.demo.aspect.InvokeLog)")public void put() {}
  1. 定义通知
    @Before("put()")public void before() {log.error("方法被调用了");}
  1. 实现注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface InvokeLog {
}

那个方法需要增强时,我们就在这个方法上面加上这个注解,如下图:
在这里插入图片描述
加过注解的方法,就会得到增强,也就是执行通知里面的代码,如下图:
在这里插入图片描述

3.3 获取增强方法相关信息

我们是在通知的参数列表当中添加一个参数 JoinPoint joinPoint 这个参数可以帮我们拿到被增强方法相关的数据

@Before("put()")public void before(JoinPoint joinPoint) {Object[] args = joinPoint.getArgs(); // 获取参数列表中的参数Object target = joinPoint.getTarget(); // 获取代理对象MethodSignature signature = (MethodSignature) joinPoint.getSignature(); // 获取被增强的方法签名封装的对象Method method = signature.getMethod(); // 获取被增强的方法log.error("方法被调用了");}

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

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

相关文章

Ubuntu20.04安装搜狗输入法

1、安装包下载 搜狗输入法linux-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://shurufa.sogou.com/linux点击立即下载&#xff0c;根据自己的硬件选择deb安装包。 2、输入法安装 当第一步完成以后&#xff0c;页面会自动跳转至搜狗的安装…

【opencv】计算机视觉:实时目标追踪

目录 前言 解析 深入探究 前言 目标追踪技术对于民生、社会的发展以及国家军事能力的壮大都具有重要的意义。它不仅仅可以应用到体育赛事当中目标的捕捉&#xff0c;还可以应用到交通上&#xff0c;比如实时监测车辆是否超速等&#xff01;对于国家的军事也具有一定的意义&a…

25 Linux I2C 驱动

一、I2C简介 I2C老朋友了&#xff0c;在单片机里面也学过&#xff0c;现在再复习一下。I2C使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线)&#xff0c;另外一条是 SDA(串行数据线)&#xff0c;这两条数据线需要接上拉电阻&#xff0c;总线空闲的时候 SCL…

docker部署phpIPAM

0说明 IPAM&#xff1a;IP地址管理系统 IP地址管理(IPAM)是指的一种方法IP扫描&#xff0c;IP地址跟踪和管理与网络相关的信息的互联网协议地址空间和IPAM系统。 IPAM软件和IP的工具,管理员可以确保分配IP地址仍然是当前和足够的库存先进的IP工具和IPAM服务。 IPAM简化并自动化…

管理类联考——数学——汇总篇——知识点突破——代数——函数——记忆

文章目录 整体文字提炼图像绘画 考点记忆/考点汇总——按大纲 本篇思路&#xff1a;根据各方的资料&#xff0c;比如名师的资料&#xff0c;按大纲或者其他方式&#xff0c;收集/汇总考点&#xff0c;即需记忆点&#xff0c;在通过整体的记忆法&#xff0c;比如整体信息很多&am…

电源控制系统架构(PCSA)之系统控制处理器组件

目录 6.4 系统控制处理器 6.4.1 SCP组件 SCP处理器Core SCP处理器Core选择 SCP处理器核内存 系统计数器和通用计时器 看门狗 电压调节器控制 时钟控制 系统控制 信息接口 电源策略单元 传感器控制 外设访问 系统访问 6.4 系统控制处理器 系统控制处理器(SCP)是…

基于Python 中创建 Sentinel-2 RGB 合成图像

一、前言 下面的python代码将带您了解如何从原始 Sentinel-2 图像创建 RGB 合成图像的过程。 免费注册后&#xff0c;可以从 Open Access Hub 下载原始图像。 请注意&#xff0c;激活您的帐户可能需要 24 小时&#xff01; 二、准备工作 &#xff08;1&#xff09;导入必要的库…

selenium的基础语法

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️山水速疾来去易&#xff0c;襄樊镇固永难开 ☁️定位页面的元素 参数:抽象类By里…

【从删库到跑路 | MySQL总结篇】数据库基础(增删改查的基本操作)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 重点放前面&am…

网络数据结构skb_buff原理

skb_buff基本原理 内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体&#xff0c;而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2&#xff0c;则是通过往sk_buff结构体中增加该层协议头来操作&#xff1b;如果是从L4到L2&#xff0c;则是通过移动sk_…

【Linux】fork()

文章目录 一、fork()是什么&#xff1f;二、fork()干了什么&#xff1f;三、fork()怎么用&#xff1f; 一、fork()是什么&#xff1f; fork()函数其实是在Linux系统中用于创建一个新的进程。让我们看看Linux中是怎么描述的&#xff1f;运行man fork。 RETURN VALUE On success…

英特尔和 ARM 将合作开发移动芯片技术,如何看待双方合作?

英特尔和 ARM 将合作开发移动芯片技术&#xff0c;如何看待双方合作&#xff1f; 最近市场传出Arm要自产芯片&#xff0c;供智能手机与笔电等使用后&#xff0c;外媒指Arm自产芯片将由英特尔晶圆代工部门打造&#xff0c;变成英特尔晶圆代工客户。将采用英特尔18A工艺&#xff…

利用Nginx与php处理方式不同绕过Nginx_host实现SQL注入

目录 首先需要搭建环境 nginxphpmysql环境&#xff1a; 搭建网站 FILTER_VALIDATE_EMAIL 绕过 方法1&#xff1a;冒号号分割host字段 方法2&#xff1a;冒号号分割host字段 方法3&#xff1a;SNI扩展绕过 首先需要搭建环境 nginxphpmysql环境&#xff1a; php安装包&a…

vue一个页面左边是el-table表格 当点击每条数据时可以在右边界面编辑表格参数,右边保存更新左边表格数据

实现思路&#xff1a; 1.点击当前行通过row拿到当前行数据。 2.将当前行数据传给子组件。 3.子组件监听父组件传过来的数据并映射在界面。 4.点击保存将修改的值传给父组件更新表格。 5.父组件收到修改过后的值&#xff0c;可以通过字段判断比如id&#xff0c;通过 findIn…

VR Interaction Framework2.0使用

1 按键 &#xff0c;比如按压下手柄的B键 if (InputBridge.Instance.BButtonDown){print("kkkkkkbbbbb456");} 2抓取某个物体&#xff0c;那么就在要抓取的那个物体上加一些组件&#xff0c;特别是Grabble Unity Events

【基础知识】AB软件RSLinx如何实现OPC通讯组态

哈喽&#xff0c;大家好&#xff0c;我是雷工。 在上一节了解了什么是RSLinx&#xff1f;以及RSLinx Lite、RSLinx Classice、RSLinx Professional、RSLinx Gateway几个版本的特点。 本节了解AB的RSLinx如何实现OPC组态。 一、创建RSLinx通讯&#xff1a; 1.1、【Communicati…

excel自己记录

1、清除换行符号 2、添加特殊符号&并清除换行符号 7日&15日&30日&60日 3、判断单元格最后一个字符是不是数字&#xff0c;不是就删掉 IF(ISNUMBER(--RIGHT(B2,1)),B2,SUBSTITUTE(B2,RIGHT(B2,1),"")) ISNUMBER(--RIGHT(B2,1))判断最右边的一个数是否…

Wireshark的捕获过滤器

Wireshark的过滤器&#xff0c;顾名思义&#xff0c;作用是对数据包进行过滤处理。具体过滤器包括捕获过滤器和显示过滤器。本文对捕获过滤器进行分析。 捕获过滤器&#xff1a;当进行数据包捕获时&#xff0c;只有那些满足给定的包含/排除表达式的数据包会被捕获。 捕获过滤器…

一起学docker系列之九docker运行mysql 碰到的各种坑及解决方法

目录 前言1 Docker 运行mysql命令2 坑一&#xff1a;无法读取/etc/mysql/conf.d目录的问题3 坑二&#xff1a;/tmp/ibnr0mis 文件无法创建/写入的问题4 坑三&#xff1a;Navicat 连接错误&#xff08;1045-access denied&#xff09;5 坑四&#xff1a;MySQL 登录失败问题结语 …

ros2文件package.xml与cmakelists.txt比较

每次在ros2里面添加文件以后&#xff0c;都要修改packages.xml,与cmakelists.txt文件。