1.@Pointcut 切入点
定义一个切点。
例如我们要在一个方法加上切入点,根据方法的返回的对象,方法名,修饰词来写成一个表达式或者是具体的名字
我们现在来定义一个切点
package com.example.aop ;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* 类定义为切面类
*/
@Aspect
@Component
public 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