1.@Pointcut 切入点

定义一个切点。

例如我们要在一个方法加上切入点,根据方法的返回的对象,方法名,修饰词来写成一个表达式或者是具体的名字

我们现在来定义一个切点

  1. package com.example.aop ;
  2. import org.aspectj.lang.annotation.Aspect;
  3. import org.aspectj.lang.annotation.Pointcut;
  4. import org.springframework.stereotype.Component;
  5. /**
  6. * 类定义为切面类
  7. */
  8. @Aspect
  9. @Component
  10. public class AopTestController{
  11. /**
  12. * 定义一个切点
  13. */
  14. @Pointcut(value = "execution(public String test (..))")
  15. public void cutOffPoint() {
  16. }
  17. }

这里的切点定义的方法是

  1. // 跟切面类在同一个包下
  2. @GetMapping("hello")
  3. public String test(){
  4. return "i love java";
  5. }

如果你想写个切入点在所有返回对象为Area的方法,如下
@Pointcut(“execution(public com.example.entity.Area (..))”)
等很多写法,也可以直接作用在某些包下
注意:private修饰的无法拦截

2.@Before前置通知

在切入点开始处切入内容

在之前的AopTestController类中加入对test方法的前置通知

  1. @Before("cutOffPoint()")
  2. public void beforeTest(){
  3. System.out.println("我在test方法之前执行");
  4. }

这里@Before里的值就是切入点所注解的方法名
image.png
在方法左侧出现的图标跟过去以后就是所要通知的方法 这里就是配置正确了

3.@After 后置通知

和前置通知相反,在切入点之后执行

  1. @After("aop()")
  2. public void aopAfter(){
  3. System.out.println("后置通知 SpringBootAspect....aopAfter");
  4. }

4.@Around环绕通知

和前两个写法不同,实现的效果包含了前置和后置通知。
当使用环绕通知时,proceed方法必须调用,否则拦截到的方法就不会再执行了
环绕通知=前置+目标方法执行+后置通知,proceed方法就是用于启动目标方法执行的

  1. @Around("aop()")
  2. public void around(ProceedingJoinPoint invocation) throws Throwable{
  3. System.out.println("SpringBootAspect..环绕通知 Before");
  4. invocation.proceed();
  5. System.out.println("SpringBootAspect..环绕通知 After");
  6. }

上面通知方法执行结果如下:
image.png
环绕通知作用:
1.环绕通知可以项目做全局异常处理
2.日志记录
3.用来做数据全局缓存
4.全局的事物处理 等

5.@AfterReturning

切入点返回结果之后执行

  1. @AfterReturning(returning = "result", pointcut = "aop()")
  2. public void doAfterReturning(Object result) throws Throwable {
  3. System.out.println("大家好,我是@AfterReturning,他们都秀完了,该我上场了");
  4. }

image.png
应用场景可以用来在订单支付完成之后就行二次的结果验证,重要参数的二次校验,防止在方法执行中的时候参数被修改等等

6.@AfterThrowing

这个是在切入执行报错的时候执行的

  1. // 声明错误e时指定的抛错类型法必会抛出指定类型的异常
  2. // 此处将e的类型声明为Throwable,对抛出的异常不加限制
  3. @AfterThrowing(pointcut="aop()",throwing="e")
  4. public void exception(Exception e){
  5. System.out.println("异常通知 SpringBootAspect...exception .." + e);
  6. }

在其他切入内容中随意整个错误出来,制造一个环境。

  1. @GetMapping("/test")
  2. public String test(){
  3. System.out.println("i love java");
  4. int[] a= new int[1];
  5. a[0]=1;
  6. System.out.println(a[2]);
  7. return "i love java";
  8. }

下面是@AfterThrowing的执行结果
image.png

7.AOP用在全局异常处理

定义切入点拦截ResultBean或者PageResultBean

https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247486924&idx=1&sn=b7be94713b18b6f0b098bcf10928cb90&chksm=ebd632e0dca1bbf6ae889232cd2146c1a262846e9ecdaf7b0d2deed1a0919e22ac1317f7a095&scene=21#wechat_redirect