zoukankan      html  css  js  c++  java
  • JAVA-Spring AOP五大通知类型

    一、前置通知

        在目标方法执行之前执行的通知

        在前置通知方法,可以没有参数,也可以额外接收一个JoinPoint,Spring会自动将该对象传入,代表当前的连接点,通过该对象可以获取目标对象和目标方法相关的信息。注意,如果接收JoinPoint,必须保证其为方法的第一个参数,否则报错!

        配置方法:

        

    二、环绕通知

        在目标方法执行之前之后都可以执行额外代码的通知。

        在环绕通知中必须显式的调用目标方法,否则目标方法不会执行。

        这个显式调用时通过ProceedingJoinPoint来实现,可以在环绕通知中接收一个此类型的形参,spring容器会自动将该对象传入,这个参数必须处在环绕通知的第一个形参位置。

        **要注意,只有环绕通知可以接收ProceedingJoinPoint,而其他通知只能接收JoinPoint。

        配置方式:

          

        环绕通知需要返回返回值,否则真正调用之将拿不到返回值,只能得到一个null。

        环绕通知有控制目标方法是否执行、目标方法执行之前或之后执行额外代码、有控制是否返回值、甚至改变返回值的能力

        环绕通知虽然有这样的能力,但一定要慎用,要小心不要破坏了软件分层的“高内聚   低耦合”的目标。

    三、后置通知

        在目标方法执行之后的通知。

        在后置通知中也可以选择性的接收一个JoinPoint来获取连接点的额外信息,但是这个参数必须处在参数列表的第一位。

        

         在后置通知中,还可以通过配置获取返回值

        

        一定要保证JoinPoint处在参数列表的第一位,否则抛异常

        

    四、异常通知

        在目标方法抛出异常时执行的通知

        配置方法:

          

        可以配置传入JoinPoint获取目标对象和目标方法相关信息,但必须处在参数列表第一位,另外,还可以配置参数,让异常通知可以接收到目标方法抛出来的异常对象

        

    五、最终通知

        是在目标方法执行之后执行的通知。和后置通知不同的是,后置通知是在方法正常返回后执行的通知,如果方法没有正常返回,比如说抛出异常,则后置通知不会执行。而最终通知无论如何都会在目标方法调用过后执行,即使目标方法没有正常的执行完成。另外,后置通知可以通过配置得到返回值,而最终通知无法得到。

        配置方式:

            

          最终通知也可以额外接受一个JoinPoint参数,来获取目标对象和目标方法相关信息,但一定要保证必须是第一个参数。

        

     -------------------------------------------------------------LK------------------------------------------------------------------------

    五种通知执行的顺序

      1.在目标方法没有抛出异常的情况下

        前置通知

        环绕通知的调用目标方法之前的代码   //--取决于配置顺序

        目标方法

        环绕通知的调用目标方法之后的代码

        后置通知              //--取决于配置顺序

        最终通知

      2.在目标方法抛出异常的情况下:

        前置通知

        环绕通知的调用目标方法之前的代码  //--取决于配置顺序

        目标方法    //抛出异常

        异常通知

        最终通知

      3.如果存在多个切面:

        多切面执行时,采用了责任链设计模式

        切面的配置顺序决定了切面的执行过程,类似于方法调用的过程,在环绕通知的proceed()执行时,去执行下一个切面或如果没有下一个切面执行目标方法,从而达成了如下的执行过程:

        

        如果目标方法抛出异常:

        

    五种通知的常见使用场景

        

  • 相关阅读:
    call_user_func和call_user_func_array的区别
    25行实现文件上传功能(PHP)
    PHP 结合MYSQL简单的实现了Todo List 功能
    向ASP.NET自定义控件中嵌入CSS资源
    模态子窗口不执行page_load
    oracle一次插入多条数据
    转载:数据库表结构设计方法及原则
    Js中的window.parent ,window.top,window.self
    在一个JS文件中包含中文字符串通过innerHTML输出后中文乱码
    转载:数据库表结构设计方法及原则
  • 原文地址:https://www.cnblogs.com/xiaoluohao/p/11286242.html
Copyright © 2011-2022 走看看