Spring AOP(通知、连接点、切点、切面)

本文内容纲要:Spring AOP(通知、连接点、切点、切面)

一、AOP术语

  1. 通知(Advice)

      切面的工作被称为通知。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。

    5种通知类型:

前置通知(Before):在目标方法被调用之前调用通知功能

后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么

返回通知(After-returning):在目标方法成功执行之后调用通知

异常通知(After-throwing):在目标方法抛出异常后调用通知

环绕通知(Around):通知包裹了被通知的方法,在被通知的方

法调用之前和之后执行自定义的行为

后置通知和返回通知的区别是,后置通知是不管方法是否有异常,都会执行该通知;而返回通知是方法正常结束时才会执行。

  1. 连接点(Join point)

      连接点是在应用执行过程中能够插入切面的一个点。

  2. 切点(Pointcut)

      一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”。因此,切点其实就是定义了需要执行在哪些连接点上执行通知。

  3. 切面(Aspect)

      切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和在何处完成其功能。

  4. 引入(Introduction)

      引入允许我们向现有的类添加新方法或属性。

  5. 织入(Weaving)

      织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有很多个点可以进行织入:

编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。

类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器,它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ 5的加载时织入就支持这种方式织入切面。

运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态的创建一个代理对象。Spring AOP就是以这种方式织入切面的。

二、Spring对AOP的支持

  创建切点来定义切面所织入的连接点是AOP框架的基本功能。Spring提供了4种类型的AOP支持:

  • 基于代理的经典Spring AOP;
  • 纯POJO切面
  • @AspectJ注解驱动的切面
  • 注入式AspectJ切面(适用于Spring各版本)

前三种都是Spring AOP实现的变体,Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截。

1.Spring在运行时通知对象

通过在代理类中包裹切面,Spring在运行期把切面织入到Spring管理的bean中。如下图所示,代理类封装了目标类,并拦截被通知方法的调用,再把调用转发给真正的目标bean。当代理拦截到方法调用时,在调用目标bean方法之前,会执行切面逻辑。

Image

直到应用需要被代理的bean时,Spring才创建代理对象。如果使用的是ApplicationContext的话,在Applicationcontext从Beanfactory中加载所有bean的时候,Spring才会创建被代理的对象。因为Spring运行时才创建代理对象,所以我们不需要特殊的编译器来织入Spring AOP的切面。

2.Spring只支持方法级别的连接点

因为Spring基于动态代理,所以Spring只支持方法连接点。这与一些其他的AOP框架是不用的,例如AspectJ和JBoss,除了方法切点,它们还提供了字段和构造器接入点。

三、通过切点来选择连接点

以下是Spring AOP所支持的AspectJ切点指示器

AspectJ指示器描述
arg()限制连接点匹配参数为指定类型的执行方法
@args()限制连接点匹配参数由指定注解标注的执行方法
execution()用于匹配是连接点的执行方法
this()限制连接点匹配AOP代理的bean引用为指定类型的类
target限制连接点匹配目标对象为指定类型的类
@target限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解
within()限制连接点匹配指定的类型
@within()限制连接点匹配指定注解所标注的类型(当使用Spring AOP时,方法定义在由指定的注解所标注的类里)
@annotation限定匹配带有指定注解的连接点

  1. 编写切点

    Image

    2.定义切面

    Image

本文内容总结:Spring AOP(通知、连接点、切点、切面)

原文链接:https://www.cnblogs.com/sandea/p/11175834.html

以上是 Spring AOP(通知、连接点、切点、切面) 的全部内容, 来源链接: utcz.com/z/296816.html

回到顶部