• 一文带你搞懂环绕通知@Around与最终通知@After的实现


    目录

    环绕通知@Around

    执行流程​编辑

    代码实现 

    接口

     实现类

    切面类

    ​编辑 环绕通知

    最终通知@After

    为一个方法添加各种通知

    给切入点表达式起别名


    环绕通知@Around


      它是通过拦截目标方法的方式 ,在目标方法前后增强功能的通知.它是功能最强大的通知,一般事务使用此通知.它可以轻易的改变目标方法的返回值。

    执行流程

    代码实现 

    接口

     实现类

    切面类

     环绕通知

    1.   @Aspect
    2. @Component
    3. public class MyAspect {
    4.     /**
    5.      * 环绕通知方法的规范
    6.      * 1)访问权限是public
    7.      * 2)切面方法有返回值,此返回值就是目标方法的返回值
    8.      * 3)方法名称自定义
    9.      * 4)方法有参数,此参数就是目标方法
    10.      * 5)回避异常Throwable
    11.      * 6)使用@Around注解声明是环绕通知
    12.      *   参数:
    13.      *      value:指定切入点表达式
    14.      */
    15.     @Around(value = "execution(* com.bjpowernode.s03.*.*(..))")
    16.     public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
    17.         //前切功能实现
    18.         System.out.println("环绕通知中的前置功能实现............");
    19.         //目标方法调用
    20.         Object obj = pjp.proceed(pjp.getArgs());
    21.         //后切功能实现
    22.         System.out.println("环绕通知中的后置功能实现............");
    23.         return obj.toString().toUpperCase();  //改变了目标方法的返回值
    24.     }
    25. }


    最终通知@After


      无论目标方法是否正常执行,最终通知的代码都会被执行。

        

    为一个方法添加各种通知

        

     

     

    给切入点表达式起别名

    给切入点表达式起别名@Pointcut
      如果多个切面切入到同一个切入点,可以使用别名简化开发。
      使用@Pointcut注解,创建一个空方法,此方法的名称就是别名。

     

     

    1. @Aspect
    2.     @Component
    3.     public class MyAspect {
    4.         /**
    5.          * 最终通知方法的规范
    6.          * 1)访问权限是public
    7.          * 2)方法没有返回值
    8.          * 3)方法名称自定义
    9.          * 4)方法没有参数,如果有也只能是JoinPoint
    10.          * 5)使用@After注解表明是最终通知
    11.          *   参数:
    12.          *     value:指定切入点表达式
    13.          */
    14.         @After(value = "mycut()")
    15.         public void myAfter(){
    16.             System.out.println("最终通知的功能........");
    17.         }
    18.         @Before(value = "mycut()")
    19.         public void myBefore(){
    20.             System.out.println("前置通知的功能........");
    21.         }
    22.         @AfterReturning(value = "mycut()",returning = "obj")
    23.         public void myAfterReturning(Object obj){
    24.             System.out.println("后置通知的功能........");
    25.         }
    26.         @Around(value = "mycut()")
    27.         public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
    28.             System.out.println("环绕通知中的前置通知的功能........");
    29.             Object obj = pjp.proceed(pjp.getArgs());
    30.             System.out.println("环绕通知中的后置通知的功能........");
    31.             return obj;
    32.         }
    33.         @Pointcut(value = "execution(* com.bjpowernode.s04.*.*(..))")
    34.         public void mycut(){}
    35.     }

    测试

     

        (1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可


     (2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值


    (3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象


    (4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式


    (5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint


     

  • 相关阅读:
    【笨~~~】在python中导入另一个模块的函数时,为什么会运行模块中剩下的部分??顶层?
    表48表48
    【ai】李沐 动手深度学学v2 环境安装:anaconda3、pycharm、d2
    博达:经营管理再升级,从选对CRM开始
    伦敦银走势图分析的新方法
    Domino Volt 1.0.5中的可视化流程设计器
    anaconda下载与spyder的报错解决
    【Mysql】MySQL 设计开发规约
    使用贪心算法实现文本左右对齐
    Linux 常用通配符
  • 原文地址:https://blog.csdn.net/weixin_48826996/article/details/125994178