1. Spring AOP概念
AOP: 面向切面编程 也叫(面向特定方法编程)
简单来说: AOP是一种思想,是对某一类事情的集中处理
某一类事情指的是: 用户登录校验 结果统一返回 异常统一处理 .....
比如"登录校验",就是一类特定问题,登录校验拦截器,就是对"登录校验"这类问题的统一处理,所以,拦截器也是AOP的一种应用 .AOP是一种思想 ,拦截器是AOP思想的一种实现,Spring框架实现了这种思想,提供了拦截器技术的相关接口.
2. Spring AOP实现
2.1 添加AOP框架依赖
![](https://file.jishuzhan.net/article/1796634110408527873/a89be2e06283b571f721e34b3b6c609a.webp)
2.2 一个切面.切点(一类特定问题)
![](https://file.jishuzhan.net/article/1796634110408527873/4b77b79b7bd495751cf1fa493853fd4b.webp)
![](https://file.jishuzhan.net/article/1796634110408527873/9a446e09350fec505041f7d5a0de3edd.webp)
2.3 优点
- 代码无侵入: 不修改源代码,就可以对原始的业务方法进行了功能增强或者功能改变.
- 减少了重复代码
- 提高开发效率
- 维护方便
3. Spring AOP 详解
3.1 Spring AOP 核心概念
3.1.1 切点 (Pointcut)
作用是提供一组规则,告诉程序对哪些方法来进行加强.
![](https://file.jishuzhan.net/article/1796634110408527873/2cc6579db5c96e23152dcd5a7fddcb23.webp)
上图就是切点表达式
3.1.2 连接点 (Join Point)
满足切点表达式规则的方法,就是连接点,也就是可以被AOP控制的方法
以图书管理程序为例,所有 org.example.demo.controller 路径下的方法,都是连接点
3.1.3 通知 (Advice)
通知就是具体要做的工作 ,指哪些重复的逻辑, 也就是共性功能(最终体现为一个方法)
3.1.4 切面 (Aspect)
切面 (Aspect)=切点 (Pointcut) + 通知 (Advice)
程序可以这样表达
![](https://file.jishuzhan.net/article/1796634110408527873/0335777fced8fec11a40c8ed0812e4d5.webp)
3.2 通知类型
3.2.1 @Around
环绕通知,此注解标注的通知方法在目标方法前后都被执行
![](https://file.jishuzhan.net/article/1796634110408527873/718c0c6e6df2560e25c155218013253b.webp)
![](https://file.jishuzhan.net/article/1796634110408527873/e076ed5bf8d287305d1f6a350613f5f0.webp)
![](https://file.jishuzhan.net/article/1796634110408527873/a36676571c2dc5dea3eb527b10d3fb8f.webp)
3.2.2 @Before
前置通知,此注解标注的通知方法在目标方法前被执行
![](https://file.jishuzhan.net/article/1796634110408527873/a8432eb2a17fe4b54f07871bac0cc374.webp)
![](https://file.jishuzhan.net/article/1796634110408527873/16ea8beca69cc37103ec774ff19eff07.webp)
3.2.3 @After
后置通知,此注解标注的通知方法 在目标方法后被执行,无论是否有异常都会被执行
![](https://file.jishuzhan.net/article/1796634110408527873/d82667e8a510391d6be8558e0bcf38bc.webp)
![](https://file.jishuzhan.net/article/1796634110408527873/25a5e65aa0289d51be685c62a504d3fb.webp)
3.2.4 @AfterReturning
返回后通知,此注解标注的通知方法在目标方法在目标方法后被执行,有异常不会被执行
![](https://file.jishuzhan.net/article/1796634110408527873/dc4e11bb7b788d717c71997e6e48e405.webp)
![](https://file.jishuzhan.net/article/1796634110408527873/90d395b7161e652130d5b8b0bd38cb08.webp)
3.2.5 @AfterThrowing
异常后通知,此注解标注的通知方法发生异常后执行
![](https://file.jishuzhan.net/article/1796634110408527873/838099e00a981a30b6143e5c8b23a8ae.webp)
![](https://file.jishuzhan.net/article/1796634110408527873/eaccbf15cb7622307a19085648ac958e.webp)
3.3 @PointCut
Spring提供了**@PointCut** 注解,把公共的切点表达式提取出来,需要用到时引⽤该切⼊点表达式即可.
![](https://file.jishuzhan.net/article/1796634110408527873/b8aea7376731ed8dad0ad81fc4bf1fa0.webp)
当切点定义使⽤private修饰时,仅能在当前切面类中使用,当其他切面类也要使用当前切点定义时 ,就需要把 private 改为 public.引用方式为:全限定类名.方法名()
![](https://file.jishuzhan.net/article/1796634110408527873/cacff9af1a46cbca48dbd8b7c85676ee.webp)
![](https://file.jishuzhan.net/article/1796634110408527873/82a84ec6ca8efb01c9e4d8ec1e52647c.webp)
3.4 切点表达式
![](https://file.jishuzhan.net/article/1796634110408527873/77f4a3a090cc16d43b60db5bc87aef83.webp)
![](https://file.jishuzhan.net/article/1796634110408527873/08c2539f1ca6b46f7fbfeb23469c6de1.webp)
- * :匹配任意字符,只匹配⼀个元素(包,类,或⽅法,⽅法参数)
- ..:匹配任意字符,可以匹配多个元素 ,在表示类时,必须和 * 联合使⽤。
- + :表示按照类型匹配指定类的所有类,必须跟在类名后⾯,如 com.cad.Car+ ,表示继承该类的所有子类包括本身