Spring Boot AOP

17 Mar 2025 | 5 分钟阅读

应用程序通常使用多个层开发。一个典型的 Java 应用程序有以下几层:

  • Web 层: 它使用 REST 或 Web 应用程序暴露服务
  • 业务层: 它实现应用程序的业务逻辑
  • 数据层: 它实现应用程序的持久化逻辑

每一层的职责都不同,但有一些适用于所有层的共同方面,如日志记录、安全性、验证、缓存等。这些共同方面称为横切关注点

如果我们在每一层中单独实现这些关注点,代码将变得更难以维护。为了克服这个问题,面向切面编程 (AOP) 提供了一种实现横切关注点的解决方案。

  • 将横切关注点实现为一个切面。
  • 定义切入点以指示切面必须应用的位置。

它确保横切关注点在一个内聚的代码组件中定义。

AOP

AOP (面向切面编程) 是一种通过允许分离横切关注点来提高模块化的编程模式。这些横切关注点与主要业务逻辑不同。我们可以在不修改代码本身的情况下向现有代码添加额外的行为。

Spring 的 AOP 框架帮助我们实现这些横切关注点。

使用 AOP,我们在一个地方定义通用功能。我们可以自由地定义如何以及在哪里应用此功能,而无需修改我们应用新功能的类。横切关注点现在可以模块化为特殊的类,称为切面

切面有 个好处:

  • 首先,每个关注点的逻辑现在都在一个地方,而不是分散在整个代码库中。
  • 其次,业务模块仅包含其主要关注点的代码。次要关注点已移至切面

切面具有要实现的职责,称为通知。我们可以在一个或多个连接点将切面的功能实现到程序中。

AOP 的优点

  • 它在纯 Java 中实现。
  • 不需要特殊的编译过程。
  • 它仅支持方法执行连接点。
  • 仅运行时织入可用。
  • 有两种类型的 AOP 代理可用:JDK 动态代理CGLIB 代理

横切关注点

横切关注点是我们想要在应用程序的多个位置实现的一个关注点。它影响整个应用程序。

AOP 术语

  • 切面 (Aspect): 切面是一个封装通知切入点并提供横切的模块。一个应用程序可以有任意数量的切面。我们可以使用使用 @Aspect 注释的常规类来实现切面。
  • 切入点 (Pointcut): 切入点是一个表达式,它选择一个或多个执行通知的连接点。我们可以使用表达式模式定义切入点。它使用与连接点匹配的不同类型的表达式。在 Spring Framework 中,使用 AspectJ 切入点表达式语言。
  • 连接点 (Join point): 连接点是我们在应用程序中应用 AOP 切面的点。或者它是通知的特定执行实例。在 AOP 中,连接点可以是方法执行、异常处理、更改对象变量值等。
  • 通知 (Advice): 通知是我们在方法执行之前之后采取的动作。该动作是在程序执行期间调用的代码片段。Spring AOP 框架中有 种类型的通知:前置、后置、返回后、抛出后环绕通知。通知用于特定的连接点。我们将在本节中进一步讨论这些通知。
  • 目标对象 (Target object): 应用通知的对象称为目标对象。目标对象始终是 代理的。这意味着在运行时创建一个子类,其中覆盖了目标方法,并根据其配置包含通知。
  • 织入 (Weaving): 它是将切面与其他应用程序类型链接的过程。我们可以在运行时、加载时编译时执行织入。

代理 (Proxy): 在将通知应用于目标对象后创建的对象称为 代理。Spring AOP 实现 JDK 动态代理 以创建具有目标类和通知调用的代理类。这些称为 AOP 代理类。

AOP vs. OOP

AOP 和 OOP 之间的区别如下:

AOPOOP
切面 (Aspect): 封装切入点、通知和属性的代码单元。类 (Class): 封装方法和属性的代码单元。
切入点 (Pointcut): 它定义了执行通知的入口点集合。方法签名 (Method signature): 它定义了方法体执行的入口点。
通知 (Advice): 它是横切关注点的实现。方法体 (Method bodies): 它是业务逻辑关注点的实现。
Waver:它构造带有通知的代码(源代码或对象)。编译器:它将源代码转换为对象代码。

Spring Boot AOP

Spring AOP vs. AspectJ

AOP 和 OOP 之间的区别如下:

Spring AOPAspectJ
需要单独的编译过程。它需要 AspectJ 编译器。
它仅支持方法执行切入点。它支持所有切入点。
它可以在由 Spring 容器管理的 bean 上实现。它可以在所有域对象上实现。
它仅支持方法级别的织入。它可以织入字段、方法、构造函数、静态初始化器、最终类等。

AOP 通知的类型

有五种类型的 AOP 通知如下:

  • 前置通知
  • 后置通知
  • 环绕通知
  • 抛出后通知
  • 返回后通知

前置通知 (Before Advice): 在连接点之前执行的通知称为前置通知。我们使用 @Before 注释将通知标记为前置通知。

后置通知 (After Advice): 在连接点之后执行的通知称为后置通知。我们使用 @After 注释将通知标记为后置通知。

环绕通知 (Around Advice): 在连接点之前和之后执行的通知称为环绕通知。

抛出后通知 (After Throwing Advice): 当连接点抛出异常时执行的通知。

返回后通知 (After Returning Advice): 当方法成功执行时执行的通知。

在应用程序中实现 AOP 之前,我们需要在 pom.xml 文件中添加 Spring AOP 依赖项。

Spring Boot Starter AOP

Spring Boot Starter AOP 是一个提供 Spring AOP 和 AspectJ 的依赖项。其中 AOP 提供基本的 AOP 功能,而 AspectJ 提供完整的 AOP 框架。

在下一节中,我们将在应用程序中实现不同的通知。