AOP笔记
AOP笔记
nodaoliAOP概述
AOP:Aspect Oriented Programming,即面向切面编程,其实就是面向特性方法编程。
动态代理的主要作用是在运行时创建一个符合特定接口的对象,这个对象可以拦截接口方法的调用,并在调用实际方法前后添加额外的处理逻辑。
Spring AOP
导入依赖:在pom.xml文件中导入依赖
1 | <dependency> |
编写AOP程序:针对于特定方法根据业务需要进行编程
使用@Component
让springboot
管理,使用@Aspect
注解成为切面类
1 |
|
AOP核心概念
- 连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)
- 通知:Advice,指哪些重复的逻辑,也就是共性功能(最终体现为一个方法)
- 切入点:Pointcut,匹配连接点的条件,通知仅会在切入点方法执行时被应用
- 目标对象:Target,通知所应用的对象
通知类型
- @Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行
- @Before:前置通知,此注解标注的通知方法在目标方法前执行
- @After:后置通知,此注解标注的通知方法在目标方法后执行,无论是否有异常都执行
- @AfterReturning:返回通知,此注解标注的通知方法在目标方法正常返回后执行,有异常不执行
- @AfterThrowing:异常后通知,此注解标注的通知方法发生异常后执行
注意事项:
- @Around环绕通知需要自己调用
ProceedingJoinPoint.proceed()
来让原始方法执行,其他通知不需要考虑目标方法执行 - @Around环绕通知方法的返回值,必须指定为
Object
,来接收原始方法的返回值。
同一切入点表达式
定义一个方法,方法名随意,使用@Pointcut
注解,指定切入点表达式
1 |
|
AOP 通知顺序
多个切面通知跟过滤器差不多,都是根据类名排序来执行:
- 字母顺序排名靠前:@Before先执行
- 字母顺序排名靠前:@After后执行
例子:
1 | @Before1 |
使用 @Order(数字) 加在切面类上面来控制顺序
- @Before:数字小值优先执行
- @After:数字大值优先执行
切入点表达式
- 切入点表达式:描述切入点方法的一种表达式
- 作用:主要用来决定项目中的哪些方法需要加入通知
- 常见形式:
- execution(…) :匹配方法的签名执行
- @annotation(…) :匹配方法上注解
execution(…)
语法:
1 | execution(访问权限? 返回值 包名.类名.?方法名(参数列表) throws 异常列表) |
- 其中带?的表示可以省略的部分
- 访问修饰符:可省略(比如:public、private、protected、default)
- 包名.类名:可省略
- throws 异常:可省略(注意是方法上声明抛出的异常,不是实际抛出的异常)
- 可以使用通配符描述切入点
- :单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分
- .. :多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数
@annotation(…)
语法:
1 |
需要自定义一个注解,加上@Retention和@Target两个注解
1 | // 运行时运行 |
然后在方法上面添加自定义注解,就可以匹配到这个方法了。
1 |
|
连接点
只有@Around
环绕通知使用ProceedingJoinPoint
,其他通知使用JoinPoint
。
JoinPoint
可以获取连接点信息,而ProceedingJoinPoint
除了可以获取连接点信息外,还可以执行原始方法。
1 | ) |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果