对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cn

AOP 概念

让我们从定义一些核心的 AOP 概念和术语开始。这些术语不是 特定于 Spring。遗憾的是,AOP 术语并不是特别直观。 但是,如果 Spring 使用自己的术语,那将更加令人困惑。spring-doc.cn

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

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

  • Advice:一个 aspect 在特定连接点采取的行动。不同类型的 建议包括 “around”、“before” 和 “after” 建议。(讨论了建议类型 稍后。许多 AOP 框架,包括 Spring,将通知建模为拦截器,并且 在 Join Point 周围维护一个拦截器链。spring-doc.cn

  • 切入点:与连接点匹配的谓词。建议与 pointcut 表达式并在与该 pointcut 匹配的任何连接点(例如 执行具有特定名称的方法)。匹配连接点的概念 by pointcut 表达式是 AOP 的核心,而 Spring 使用 AspectJ pointcut 表达式语言。spring-doc.cn

  • 简介:代表类型声明其他方法或字段。Spring AOP 允许您将新接口(和相应的实现)引入到任何 advised 对象。例如,你可以使用 introduction 使 bean 实现一个接口,以简化缓存。(引言称为 inter-type 声明。IsModifiedspring-doc.cn

  • Target object:由一个或多个方面通知的对象。也称为 “Advised Object” 的 Visd 对象。由于 Spring AOP 是使用运行时代理实现的,因此 object 始终是代理对象。spring-doc.cn

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

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

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

  • Before advice:在连接点之前运行但没有 防止执行流继续到连接点的能力(除非它抛出 一个例外)。spring-doc.cn

  • After returning advice:在连接点完成后运行的通知 通常(例如,如果方法返回而不引发异常)。spring-doc.cn

  • 抛出后通知:如果方法通过抛出 例外。spring-doc.cn

  • After (finally) advice:无论 连接点退出 (正常或异常返回)。spring-doc.cn

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

围绕建议是最普遍的建议。从 Spring AOP 开始,就像 AspectJ 一样, 提供了全系列的建议类型,我们建议你使用最弱的 advice 类型。例如,如果您只需要 使用方法的返回值更新 Cache,则最好实现 返回 advice 后比 around 建议,虽然 around 建议可以完成 同样的事情。使用最具体的 Advice 类型提供更简单的编程模型 出错的可能性较小。例如,您不需要调用 used for around 通知上的方法,因此,您不能不调用它。proceed()JoinPointspring-doc.cn

所有通知参数都是静态类型的,因此您可以使用 适当的类型(例如,方法执行的返回值的类型),而不是 than 数组。Objectspring-doc.cn

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