总结:
理解AOP@Before,@After,@AfterReturning,@AfterThrowing执行顺序
实现AOP的切面主要有以下几个要素:
使用@Aspect注解将一个java类定义为切面类
使用@Pointcut定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。
根据需要在切入点不同位置的切入内容
使用@Before在切入点开始处切入内容
使用@After在切入点结尾处切入内容
使用@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
使用@Around在切入点前后切入内容,并自己控制何时执行切入点自身的内容
使用@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑
try{
try{
doBefore();//对应@Before注解的方法切面逻辑
method.invoke();
}finally{
doAfter();//对应@After注解的方法切面逻辑
}
doAfterReturning();//对应@AfterReturning注解的方法切面逻辑
}catch(Exception e){
doAfterThrowing();//对应@AfterThrowing注解的方法切面逻辑
}
用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before、@Around和@After等advice。最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了AOP功能。我使用到了@Before、@Around这两个advice。但在,使用过程中,却对它们的执行顺序并不清楚。为了弄清楚在不同情况下,这些advice到底是以怎么样的一个顺序进行执行的,我作了个测试,在此将其记录下来,以供以后查看。
前提
对于AOP相关类(aspect、pointcut等)的概念,本文不作说明。
对于如何让spring框架扫描到AOP,本文也不作说明。
情况一: 一个方法只被一个Aspect类拦截
当一个方法只被一个Aspect拦截时,这个Aspect中的不同advice是按照怎样的顺序进行执行的呢?请看:
添加 PointCut类
该pointcut用来拦截test包下的所有类中的所有方法。
package test;
import org.aspectj.lang.annotation.Pointcut;
public class PointCuts {
@Pointcut(value = "within(test.*)")
public void aopDemo() {
}
}
package test; import org.aspectj.lang.annotation.Pointcut;
public class PointCuts
{ @Pointcut(value = "within(test.*)") public void aopDemo() { } }
拦截 具体的注解类
@Before("@annotation(com.cxqz.config.MaxAllowVue)")