这几天使用SpringBoot Aop 进行aop的使用 ,对其进行记录
注解:
建立链接:
@Aspect :表明是一个切面类
@Pointcut :切入点,PointCut(切入点)表达式有很多种,其中execution用于使用切面的连接点。
具体操作:
@Before :前置通知,在方法执行之前执行
@After :后置通知,在方法执行之后执行
@AfterRuturning :返回通知,在方法返回结果之后执行
@AfterThrowing :异常通知,在方法抛出异常之后执行
@Around :环绕通知,围绕着方法执行
特殊点解释:
Joinpoint(连接点):所谓连接点是指那些被拦截到的点,在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点,通俗的说就是被增强类中的所有方法(上述具体操作都可以使用此方法进行接收,再对其进行解析。)
PointCut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义,通俗的说就是被增强类中的被增强的方法,因为被增强类中并不是所有的方法都被代理了
execution 表达式
例如:
@Pointcut("execution(public * com.ycm.testaop.service.Test.test(..))")
写到一个方法上如:
public void pointcut(){ }
在进行对其进行@AfterRuturning操作
@AfterRuturning(“pointcut()&& args(id,name)”)
public void test(JoinPoint jp,Long id,String name){
System.out.println(name);
}
解释:
上述方法所在的类的需要加上 @Aspect与@Component 注解,声明为切面,交给spring容器进行管理。
@AfterRuturning(“pointcut()&& args(id,name)”) :
args 内为参数,上述由于切点为一个方法可以确定其传入参数,可以省略JoinPoint。
如:
@AfterRuturning(“pointcut()&& args(id,name)”)
public void test(,Long id,String name){
System.out.println(name);
}
可正常运行:
在实际操作时通常为记录主要业务数据,切入点一般为一个接口的所有方法,从JoinPoint 内取出数据在做具体处理,不是主要业务则具体到一个方法进行处理。
execution(public * com.ycm.testaop.service.Test.test(..) 表达式
*代表所有返回类型,
(..)表示任意参数,后可接 args 。