📜  Spring Boot – AOP(面向方面的编程)

📅  最后修改于: 2022-05-13 01:54:42.686000             🧑  作者: Mango

Spring Boot – AOP(面向方面的编程)

Java应用程序是在多层中开发的,以增加安全性、分离业务逻辑、持久性逻辑等。典型的Java应用程序具有三层,即Web 层、业务层数据层

  • Web 层:该层用于使用 REST API 或 Web 应用程序向最终用户提供服务。
  • 业务层:应用程序的所有业务逻辑都在这一层编写和处理。
  • 数据层:该层用于实现应用程序的持久化逻辑。

AOP(面向方面编程)

AOP 是一种编程范式,其主要目的是通过允许分离横切关注点来增加模块化。 AOP 通过在现有代码中添加额外的行为而不修改代码本身来做到这一点。它提供了分别添加新代码和行为的功能。

AOP 为我们提供了在一个类中定义所有常见关注点的灵活性,我们可以定义所有这些关注点的使用位置以及它们在类中的使用方式,而无需修改现有代码并应用新功能。这个具有所有横切关注点的类被模块化为一个特定的类,称为Aspect 。为了使用 AOP,我们需要在Advice类中实现切面的职责。

方面类为我们提供了以下灵活性:

  1. 在单个类中定义每个关注点,而不是将关注点分散到整个代码库中。
  2. 业务层只包含主要逻辑,所有次要逻辑和关注点都放在一个类中。

面向切面编程中有一些关键术语以下表的方式显示,如下所示:

TerminologiesAction Performed
AspectIt is a module that provides cross-cutting concerns by encapsulating the advice and pointcuts. An application can have any number of aspects in it. In order to use it, we need to annotate a class with @Aspect annotation.
AdviceIt is an action that is taken before or after method execution. An action is a block of code that gets invoked during the execution of a program. The Spring AOP framework support five type of advice before, after, after-returning, after-throwing, and around advice. The advice is taken for join points. Advice is applied over the target object.
PointcutsPointcuts are the set of join points where the advice is executed. These pointcuts are defined using the expression or pattern.
Join PointsIt is a place in an application where the AOP Aspect is applied. A join point can be a method execution, exception handling, etc.
Target ObjectIt is an object where the advice is applied. These target objects are proxied
ProxiedTarget objects are proxied which means during the runtime the target methods are overridden and depending on method configuration, the advice is included in the target object.
WeavingThe process of linking the application with the aspect is called weaving. It can be done at load time, compile time and run time.

为什么我们需要 AOP?

在 Web 应用程序中,每一层(Web、业务和数据层)负责不同的任务,它们分别执行这些任务。但是有一些共同的方面适用于每一层,例如安全性、缓存、验证等。这些共同的方面被称为横切关注点

在每个模块中单独实现这些横切关注点也使得代码冗长,难以管理。为了克服这个问题,引入了面向方面的编程。其中,我们将这些横切关注点作为一个切面来实现,并定义切入点(一组连接点)应该应用这些切面。