Spring boot教程-Spring Boot AOP
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之间的区别如下:
AOP | OOP |
---|---|
切面:封装了切点、通知和属性的代码单元。 | 类:封装了方法和属性的代码单元。 |
切点:定义了通知执行的入口点集合。 | 方法签名:定义了方法体执行的入口点。 |
通知:它是横切关注点的实现。 | 方法体:它是业务逻辑关注点的实现。 |
织入:它构造了带有通知的代码(源代码或对象代码)。 | 编译:它将源代码转换为对象代码。 |
Spring AOP vs. AspectJ
Spring AOP和AspectJ之间的区别如下:
Spring AOP | AspectJ |
---|---|
需要一个单独的编译过程。 | 需要使用AspectJ编译器。 |
仅支持方法执行的切点。 | 支持所有类型的切点。 |
可以应用于由Spring容器管理的Bean。 | 可以应用于所有领域对象。 |
仅支持方法级别的织入。 | 可以对字段、方法、构造函数、静态初始化器、final类等进行织入。 |
AOP通知类型:
- 前置通知(Before Advice):在连接点之前执行的通知。
- 后置通知(After Advice):在连接点之后执行的通知。
- 环绕通知(Around Advice):在连接点之前和之后执行的通知。
- 异常通知(After Throwing Advice):在连接点抛出异常时执行的通知。
- 返回通知(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>
在下一节中,我们将在应用程序中实现不同类型的通知。