+-
Spring AOP有哪些通知类型,它们的执行顺序是怎样的?
   
   

公众号关注 “程序员解析”

设为“星标”,重磅干货,第一时间送达

前言


这篇比较简单,但是群友反馈面试被问到了,关键还没答出来,而且还是项目中用的比较多的技术点。还是要在平时开发中有一丢丢好奇心,多点进去看看代码啊!


通知类型


在基于Spring AOP编程的过程中,基于AspectJ框架标准,spring中定义了五种类型的通知,它们分别是:


  • 前置通知 (@Before) 。

  • 返回通知 (@AfterReturning) 。

  • 异常通知 (@AfterThrowing) 。

  • 后置通知 (@After)。

  • 环绕通知 (@Around) :(优先级最高)


  • 通知执行顺序


    将上面的所有通知类型写入同一个切面中,它的执行顺序为:



    代码展示


    package com.cy.pj.common.aspect;

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;

    @Aspect
    @Component
    public class SysTimeAspect {

     /**
      * 切入点
      */
     @Pointcut("bean(sysMenuServiceImpl)")
     public void doTime(){}

     @Before("doTime()")
     public void doBefore(JoinPoint jp){
      System.out.println("time doBefore()");
     }
     @After("doTime()")
     public void doAfter(){//类似于finally{}代码块
      System.out.println("time doAfter()");
     }
     /**核心业务正常结束时执行
      * 说明:假如有after,先执行after,再执行returning*/
     @AfterReturning("doTime()")
     public void doAfterReturning(){
      System.out.println("time doAfterReturning");
     }
     /**核心业务出现异常时执行
      * 说明:假如有after,先执行after,再执行Throwing*/
     @AfterThrowing("doTime()")
     public void doAfterThrowing(){
      System.out.println("time doAfterThrowing");
     }
     @Around("doTime()")
     public Object doAround(ProceedingJoinPoint jp)
       throws Throwable{
      System.out.println("doAround.before");
      try {
      Object obj=jp.proceed();
      return obj;
      }catch(Throwable e) {
      System.out.println("doAround.error-->"+e.getMessage());
      throw e;
      }finally {
      System.out.println("doAround.after");
      }
     }

    }


    代码正常结束



    代码出现异常



    更多精彩内容,关注我们▼▼

    如果觉得这篇文章还不错
    点击下面卡片关注我
    点个“在看”吧