让我们首先定义一些核心的 AOP 概念和术语。这些条款不是 特定于弹簧。不幸的是,AOP 术语并不是特别直观。 但是,如果 Spring 使用自己的术语,那就更令人困惑了。

  • 方面:跨多个类别的关注点的模块化。 事务管理是企业 Java 中横切关注的一个很好的例子 应用。在 Spring AOP 中,方面是通过使用常规类来实现的 (基于模式的方法)或使用注释注释的常规类(@AspectJ样式)。@Aspect

  • 连接点:程序执行过程中的一个点,例如执行 方法或异常的处理。在 Spring AOP 中,连接点始终是 表示方法执行。

  • 建议:某个方面在特定连接点采取的操作。不同类型的 建议包括“周围”、“之前”和“之后”的建议。(讨论建议类型 后来。许多 AOP 框架(包括 Spring)将建议建模为拦截器和 在连接点周围维护一连串的拦截器。

  • Pointcut:与连接点匹配的谓词。建议与 Pointcut 表达式,并在与 Pointcut 匹配的任何连接点处运行(例如, 执行具有特定名称的方法)。匹配连接点的概念 by pointcut 表达式是 AOP 的核心,Spring 使用 AspectJ pointcut 默认表达式语言。

  • 简介:代表类型声明其他方法或字段。春天 AOP 允许您将新接口(和相应的实现)引入到任何 建议对象。例如,您可以使用 introduction 使 Bean 实现接口,以简化缓存。(引言称为 AspectJ 社区中的 inter-type 声明。IsModified

  • 目标对象:由一个或多个方面建议的对象。也称为 “建议对象”。由于 Spring AOP 是使用运行时代理实现的,因此 对象始终是代理对象。

  • AOP 代理:由 AOP 框架创建的对象,用于实现 aspect 合同(建议、方法、执行等)。在 Spring Framework 中,AOP 代理 是 JDK 动态代理或 CGLIB 代理。

  • 编织:将方面与其他应用程序类型或对象链接以创建一个 建议对象。这可以在编译时完成(使用 AspectJ 编译器,用于 示例)、加载时或运行时。Spring AOP,就像其他纯 Java AOP 框架一样, 在运行时执行编织。

Spring AOP 包括以下类型的建议:

  • 在建议之前:在连接点之前运行但没有的建议 阻止执行流继续到连接点的能力(除非它抛出 例外)。

  • 返回建议后:连接点完成后运行的建议 通常(例如,如果方法返回而不引发异常)。

  • 抛出建议后:如果方法通过抛出 例外。

  • 之后(最终)建议:无论通过何种方式运行的建议 加入点退出(正常或异常返回)。

  • 围绕建议:围绕联接点(如方法调用)的建议。 这是最有力的建议。周围建议可以执行自定义行为 在方法调用之前和之后。它还负责选择是否 继续到连接点,或者通过返回其 自己的返回值或引发异常。

围绕建议是最普遍的建议。从Spring AOP开始,像AspectJ一样, 提供了全方位的建议类型,我们建议您使用功能最弱的 可以实现所需行为的建议类型。例如,如果您只需要 使用方法的返回值更新缓存,最好实现 在返回建议后,比周围的建议,尽管周围的建议可以完成 同样的事情。使用最具体的建议类型可提供更简单的编程模型 出错的可能性较小。例如,您不需要调用用于周围建议的方法,因此,您不能不调用它。proceed()JoinPoint

所有建议参数都是静态类型化的,因此您可以使用以下建议参数 适当的类型(例如,方法执行的返回值的类型)而不是 比数组。Object

与切点匹配的连接点的概念是 AOP 的关键,它区分了 它来自仅提供拦截的旧技术。Pointcuts使建议成为 独立于面向对象的层次结构进行定位。例如,您可以应用 围绕建议,为一组方法提供声明性事务管理,这些方法跨越 多个对象(例如服务层中的所有业务操作)。