📜  Spring Boot AOP

📅  最后修改于: 2021-01-11 05:16:13             🧑  作者: Mango

Spring Boot AOP

该应用程序通常是多层开发的。典型的Java应用程序具有以下几层:

  • Web层:它使用REST或Web应用程序公开服务。
  • 业务层:它实现了应用程序的业务逻辑。
  • 数据层:它实现了应用程序的持久性逻辑。

每一层的职责不同,但是有一些适用于所有层的通用方面是日志记录,安全性,验证,缓存等。这些通用方面称为跨领域关注点。

如果我们分别在每一层中实现这些问题,则代码将变得更加难以维护。为了克服此问题,面向方面的编程(AOP)提供了一种解决跨领域问题的解决方案。

  • 实施跨领域关注是一个方面。
  • 定义切入点以指示必须在哪个方面应用方面。

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

行动计划

AOP (面向方面的编程)是一种编程模式,可通过允许横切关注点分离来提高模块化。这些跨部门关注点与主要业务逻辑不同。我们可以向现有代码添加其他行为,而无需修改代码本身。

Spring的AOP框架可帮助我们实现这些跨领域的关注。

使用AOP,我们可以在一处定义通用功能。我们可以自由定义应用此功能的方式和位置,而无需修改应用新功能的类。现在,可以将横切关注点模块化为特殊类,称为Aspect

方面有两个好处:

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

这些方面具有要实施的责任,称为建议。我们可以在一个或多个连接点将方面的功能实现到程序中。

AOP的好处

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

跨领域关注

横切关注点是我们要在应用程序中的多个地方实现的关注点。它影响整个应用程序。

AOP术语

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

代理:这是在将建议应用于目标对象之后创建的对象,称为代理。 Spring AOP实现了JDK动态代理,以使用目标类和建议调用创建代理类。这些称为AOP代理类。

AOP与OOP

AOP和OOP之间的区别如下:

AOP OOP
Aspect: A code unit that encapsulates pointcuts, advices, and attributes. Class: A code unit that encapsulates methods and attributes.
Pointcut: It defines the set of entry points in which advice is executed. Method signature: It defines the entry points for the execution of method bodies.
Advice: It is an implementation of cross-cutting concerns. Method bodies: It is an implementation of the business logic concerns.
Waver: It constructs code (source or object) with advice. Compiler: It converts source code to object code.

”Spring

Spring AOP与AspectJ

AOP和OOP之间的区别如下:

Spring AOP AspectJ
There is a need for a separate compilation process. It requires the AspectJ compiler.
It supports only method execution pointcuts. It supports all pointcuts.
It can be implemented on beans managed by Spring Container. It can be implemented on all domain objects.
It supports only method level weaving. It can wave fields, methods, constructors, static initializers, final class, etc.

AOP咨询的类型

AOP建议有五种类型,如下所示:

  • 咨询前
  • 咨询后
  • 忠告
  • 投掷后
  • 回国后

在建议之前:在连接点之前执行的建议被称为建议之前。我们使用@Before注释将建议标记为Before建议。

咨询后:在咨询点之后执行的建议在连接点之后执行。我们使用@After注释将建议标记为After建议。

围绕建议:在连接点之前和之后执行的建议被称为围绕建议。

投掷建议后:当连接点抛出异常时执行的建议。

返回建议后:当方法成功执行时执行的建议。

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

Spring Boot Starter AOP

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


org.springframework.boot
spring-boot-starter-aop
2.2.2.RELEASE

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