此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

AOP 概念

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

  • 方面:跨多个类的关注点的模块化。事务管理是企业 Java 中跨领域关注点的一个很好的例子 应用。 在 Spring AOP 中,方面是通过使用常规类(基于模式的方法)或使用@Aspect注释(@AspectJ样式)。spring-doc.cadn.net.cn

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

  • 建议:某个方面在特定连接点采取的作。不同类型的建议包括“周围”、“之前”和“之后”建议。(建议类型讨论稍后。许多 AOP 框架,包括 Spring,将建议建模为拦截器,并且在连接点周围维护拦截器链。spring-doc.cadn.net.cn

  • 切入点:匹配连接点的谓词。通知与切入点表达式相关联,并在切入点匹配的任何连接点上运行(例如,执行具有特定名称的方法)。匹配的连接点的概念通过切入点表达式是 AOP 的核心,Spring 使用 AspectJ 切入点默认情况下的表达式语言。spring-doc.cadn.net.cn

  • 简介:代表类型声明其他方法或字段。 Spring AOP 允许您向任何advised 对象引入新接口(以及相应的实现)。例如,您可以使用介绍使 bean 实现IsModified接口,以简化缓存。(在 AspectJ 社区中,引入称为inter 类型声明。spring-doc.cadn.net.cn

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

  • AOP 代理:AOP 框架创建的对象,用于实现方面合约(通知方法执行等)。在 Spring 框架中,AOP 代理是 JDK 动态代理或 CGLIB 代理。spring-doc.cadn.net.cn

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

Spring AOP 包括以下类型的建议:spring-doc.cadn.net.cn

  • 建议之前:在连接点之前运行但没有阻止执行流继续到连接点的能力(除非它抛出异常)。spring-doc.cadn.net.cn

  • 返回通知后:连接点完成后要运行的通知通常(例如,如果方法返回而不抛出异常)。spring-doc.cadn.net.cn

  • 抛出建议后:如果方法通过抛出 例外。spring-doc.cadn.net.cn

  • 在(最后)建议之后:无论以何种方式运行建议连接点退出(正常或异常返回)。spring-doc.cadn.net.cn

  • 周围建议:围绕连接点的建议,例如方法调用。这是最强大的建议。周围建议可以执行自定义行为方法调用之前和之后。它还负责选择是否继续到连接点或通过返回其自己的返回值或抛出异常来快捷方式执行建议的方法。spring-doc.cadn.net.cn

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

所有通知参数都是静态类型的,以便您可以使用 适当的类型(例如,方法执行的返回值的类型)而不是 比Object阵 列。spring-doc.cadn.net.cn

切入点匹配的连接点的概念是AOP的关键,它区分了 它来自仅提供拦截的旧技术。切入点使建议成为 独立于面向对象层次结构的目标。例如,您可以应用 围绕向一组跨越 多个对象(例如服务层中的所有业务作)。spring-doc.cadn.net.cn