Spring Boot AOP

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

  • Web层:*通过REST或Web应用程序公开*服务
  • 业务层:*实现应用程序的*业务逻辑
  • 数据层:*实现应用程序的*持久化逻辑

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

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

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

这确保了横切关注点在一个统一的代码组件中定义。

AOP

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

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

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

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

AOP的好处

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

横切关注点

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

AOP术语

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

代理:*在应用通知到目标对象之后创建的对象称为*代理。Spring AOP实现了JDK动态代理,用于在目标类和通知调用之间创建代理类。这些称为AOP代理类。

AOP vs. OOP

AOP和OOP之间的区别如下:

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

c0d2a3d3ab61c93b50d60a85b6a262d.png

Spring AOP vs. AspectJ

Spring AOP和AspectJ之间的区别如下:

Spring AOPAspectJ
需要一个单独的编译过程。需要使用AspectJ编译器。
仅支持方法执行的切点。支持所有类型的切点。
可以应用于由Spring容器管理的Bean。可以应用于所有领域对象。
仅支持方法级别的织入。可以对字段、方法、构造函数、静态初始化器、final类等进行织入。

AOP通知类型:

  1. 前置通知(Before Advice):在连接点之前执行的通知。
  2. 后置通知(After Advice):在连接点之后执行的通知。
  3. 环绕通知(Around Advice):在连接点之前和之后执行的通知。
  4. 异常通知(After Throwing Advice):在连接点抛出异常时执行的通知。
  5. 返回通知(After Returning Advice):在连接点成功执行并返回结果时执行的通知。

在应用AOP之前,需要在pom.xml文件中添加Spring AOP依赖项。可以使用Spring Boot Starter AOP,它提供了Spring AOP和AspectJ的基本功能。

<dependency>  
<groupId>org.springframework.boot</groupId>  
<artifactId>spring-boot-starter-aop</artifactId>  
<version>2.2.2.RELEASE</version>  
</dependency>  

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

标签: spring, Spring教程, Spring语言学习, Spring框架, Spring框架教程, Spring框架高级教程, spring boot, spring boot入门教程, spring boot学习教程, spring boot下载, spring boot框架入门, spring boot面试题, spring boot笔试题, spring boot学习指南, spring boot技术