一、Spring的AOP分为以下5种类型通知

①前置通知(Before):在连接点执行前执行该通知

②正常返回通知(AfterReturning):在连接点正常执行完后执行该通知,若目标方法执行异常则不会执行该通知

③异常返回通知(AfterThrowing):在连接点执行抛出异常时执行该通知

④后置通知(after/finally):在连接点执行完成后(不管成功、失败、异常)都会执行该通知

⑤环绕通知(Around):围绕在连接点前后

二、执行顺序

1、正常执行

①环绕通知:@Around

②前置通知:@Before

③连接点方法执行

④环绕通知:@Around

⑤后置通知:@After

⑥正常返回通知:@AfterReturning

  其他结论说出来也没意思,还是自己通过简单demo测试一下就出来了

三、测试

1、自定义注解

SpringAOP学习之5种通知

2、切面

SpringAOP学习之5种通知

@Aspect
@Component
@Slf4j
public class LogAspect {
    //切点范围
    @Pointcut("@annotation(com.test.annotation.OperateLog)")
    public void operateMethod(){}
    //前置通知
    @Before("operateMethod()")
    public void before(){
        log.info("前置通知:Before");
    }
    //正常返回通知
    @AfterReturning("operateMethod()")
    public void afterReturning(){
        log.info("后置通知:AfterReturning");
    }
    //后置通知
    @After("operateMethod()")
    public void after(){
        log.info("后置通知:After");
    }
    //异常返回通知
    @AfterThrowing("operateMethod()")
    public void afterThrowing(){
        log.info("异常返回通知:AfterThrowing");
    }
    //环绕通知
    @Around("operateMethod()")
    public Object methodAround(ProceedingJoinPoint joinPoint) throws Throwable{
        log.info("环绕通知:around------前");
        Object result=null;
        OperateLog annotation = getAnnotation(joinPoint);
        try {
            result=joinPoint.proceed();
        } catch (Throwable throwable) {
            log.info("环绕通知:around------异常");
        }
        try {
            String system = annotation.system();
            int flag = annotation.flag();
            String operatorName = annotation.operatorName();
            log.info("切面校验信息,系统:【{}】,标识:【{}】,操作员名称:【{}】", system,flag,operatorName);
            //日志入库业务
        } catch (Exception e) {
            log.info("切面异常",e);
        }
        log.info("环绕通知:around------后");
        return result;
    }

    private OperateLog getAnnotation(JoinPoint joinPoint){
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        Method method = signature.getMethod();
        return method.getAnnotation(OperateLog.class);
    }
}
切面代码

相关文章: