1.@Pointcut 切入点
定义一个切点。
例如我们要在一个方法加上切入点,根据方法的返回的对象,方法名,修饰词来写成一个表达式或者是具体的名字
我们现在来定义一个切点
package com.example.aop ;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;/*** 类定义为切面类*/@Aspect@Componentpublic class AopTestController{/*** 定义一个切点*/@Pointcut(value = "execution(public String test (..))")public void cutOffPoint() {}}
这里的切点定义的方法是
// 跟切面类在同一个包下@GetMapping("hello")public String test(){return "i love java";}
如果你想写个切入点在所有返回对象为Area的方法,如下
@Pointcut(“execution(public com.example.entity.Area (..))”)
等很多写法,也可以直接作用在某些包下
注意:private修饰的无法拦截
2.@Before前置通知
在切入点开始处切入内容
在之前的AopTestController类中加入对test方法的前置通知
@Before("cutOffPoint()")public void beforeTest(){System.out.println("我在test方法之前执行");}
这里@Before里的值就是切入点所注解的方法名
在方法左侧出现的图标跟过去以后就是所要通知的方法 这里就是配置正确了
3.@After 后置通知
和前置通知相反,在切入点之后执行
@After("aop()")public void aopAfter(){System.out.println("后置通知 SpringBootAspect....aopAfter");}
4.@Around环绕通知
和前两个写法不同,实现的效果包含了前置和后置通知。
当使用环绕通知时,proceed方法必须调用,否则拦截到的方法就不会再执行了
环绕通知=前置+目标方法执行+后置通知,proceed方法就是用于启动目标方法执行的
@Around("aop()")public void around(ProceedingJoinPoint invocation) throws Throwable{System.out.println("SpringBootAspect..环绕通知 Before");invocation.proceed();System.out.println("SpringBootAspect..环绕通知 After");}
上面通知方法执行结果如下:
环绕通知作用:
1.环绕通知可以项目做全局异常处理
2.日志记录
3.用来做数据全局缓存
4.全局的事物处理 等
5.@AfterReturning
切入点返回结果之后执行
@AfterReturning(returning = "result", pointcut = "aop()")public void doAfterReturning(Object result) throws Throwable {System.out.println("大家好,我是@AfterReturning,他们都秀完了,该我上场了");}

应用场景可以用来在订单支付完成之后就行二次的结果验证,重要参数的二次校验,防止在方法执行中的时候参数被修改等等
6.@AfterThrowing
这个是在切入执行报错的时候执行的
// 声明错误e时指定的抛错类型法必会抛出指定类型的异常// 此处将e的类型声明为Throwable,对抛出的异常不加限制@AfterThrowing(pointcut="aop()",throwing="e")public void exception(Exception e){System.out.println("异常通知 SpringBootAspect...exception .." + e);}
在其他切入内容中随意整个错误出来,制造一个环境。
@GetMapping("/test")public String test(){System.out.println("i love java");int[] a= new int[1];a[0]=1;System.out.println(a[2]);return "i love java";}
下面是@AfterThrowing的执行结果
7.AOP用在全局异常处理
定义切入点拦截ResultBean或者PageResultBean
