Spring系列(七)

时间:2020-07-04 21:10:20   收藏:0   阅读:79

AOP(二)SpringAOP详解

1. 基本概念


2. 切入点表达式


  1. with表达式

    通过类名进行匹配,是一种粗粒度的切入点表达式,会将这个类中的所有连接点进行表达式识别,成为切入点。
    with(包名.类名)

  2. execution表达式

    细粒度的切入点表达式,可以以方法为单位定义切入点规则。
    execution(返回值类型 包名.类名.方法名(参数类型,参数类型))

3. Spring的五大通知类型


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

  2. 环绕通知:在目标方法执行之前和执行之后都可以执行额外代码的通知。
    在环绕通知中,必须显示的调用目标方法,否则目标方法不会执行。此调用通过ProceedingJoinPoint实现,可以在环绕通知中接收一个此类型的形参,spring容器会自动将该对象传入,这个参数必须处在环绕通知的第一个形参位置。
    注意:

    • ProceedingJoinPoint时JoinPoint的子类,只有环绕通知可以接收ProceedingJoinPoint,而其他通知只能接收JoinPoint。
    • 环绕通知需要返回返回值,否则真正调用者将拿不到返回值,只能得到一个null。
    • 用处:
      1. 控制目标方法是否执行。
      2. 目标方法执行之前或之后执行额外代码。
      3. 控制是否返回返回值。
      4. 改变返回值。
  3. 后置通知:在目标方法执行成功之后执行的通知。
    在后置通知中也可以选择性的接收一个JoinPoint来获取连接点的额外信息,但是这个参数必须处在参数列表的第一个。
    在后置通知中,还可以通过配置获取目标方法的返回值。

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

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

4. 五类通知执行的顺序


  1. 在目标方法没有抛出异常的情况下
    • 前置通知
    • 环绕通知的调用目标方法之前的代码(取决于配置顺序)
    • 目标方法
    • 环绕通知的调用目标方法之后的代码
    • 后置通知
    • 最终通知(取决于配置顺序)
  2. 在目标方法抛出异常的情况下
    • 前置通知
    • 环绕通知的调用目标方法之前的代码(取决于配置顺序)
    • 目标方法 抛出异常
    • 异常通知
    • 最终通知(取决于配置顺序)
  3. 如果存在多个切面
    多个切面执行时,采用了责任链设计模式,切面的配置顺序决定了切面的执行顺序,执行过程类似于方法调用的过程。在环绕统治的proceed()执行时,去执行下一个切面。

5. 五种通知的常见使用场景


6. SpringAOP原理


Spring在创建bean时,除了创建目标对象bean之外,会根据aop的配置,生产目标对象的代理对象,将其存储之后获取bean时得到的其实是代理对象,在代理对象中,会根据配置的切入点规则,决定哪些方法不处理,哪些方法拦截后增强,需要增强的方法拦截后根据配置调用指定切面中的指定通知执行增强操作。

Spring自动为目标对象生成代理对象,默认情况下如果目标对象实现过接口,则采用java的动态代理机制,如果目标对象没有实现过接口,则采取cglib动态代理。

可以在spring中配置,要求无论目标对象是否实现过接口,都强制使用cglib动态代理。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!