Spring注解@After,@Around,@Before的执行顺序?( 四 )


而如果我们刚才定义的方法是写在 TestController 之下的,那么就不符合@Around方法的匹配规则了,也不符合@before@after的注解规则,因此不会匹配任何一个规则,如果需要匹配特定的方法,可以用自定义的注解形式或者特性controller下的方法
①:特性的注解形式
@Pointcut("@annotation(com.lmx.blog.annotation.RedisCache)")
@Order(1) // Order 代表优先级,数字越小优先级越高
public void annoationPoint(){};

然后在所需要的方法上加入@RedisCache注解,在@Before@After@Around等方法上添加该切点的方法名(“annoationPoint()”),如果有多个注解需要匹配则用||隔开
②:指定controller或者指定controller下的方法
@Pointcut("execution(public * com.lmx.blog.controller.UserController.*(..))")
@Order(2)
public void pointCut(){};

该部分代码是指定了com.lmx.blog.controller包下的UserController下的所有方法 。
第一个*代表的是返回类型不限
第二个*代表的是该controller下的所有方法,(..)代表的是参数不限
总结
当方法符合切点规则不符合环绕通知的规则时候,执行的顺序如下
@Before→@After→@AfterRunning(如果有异常→@AfterThrowing)
当方法符合切点规则并且符合环绕通知的规则时候,执行的顺序如下
@Around→@Before→@Around→@After执行 ProceedingJoinPoint.proceed() 之后的操作→@AfterRunning(如果有异常→@AfterThrowing)
 

作者:Leonis丶L https://blog.csdn.NET/lmx125254/article/details/84398412




推荐阅读