本文概述
该应用程序通常是多层开发的。典型的Java应用程序具有以下几层:
- Web层:它使用REST或Web应用程序公开服务。
- 业务层:它实现了应用程序的业务逻辑。
- 数据层:它实现了应用程序的持久性逻辑。
每一层的职责不同, 但是有一些适用于所有层的通用方面是日志记录, 安全性, 验证, 缓存等。这些通用方面称为跨领域关注点。
如果我们分别在每一层中实现这些问题, 则代码将变得更加难以维护。为了克服此问题, 面向方面的编程(AOP)提供了一种解决跨领域问题的解决方案。
- 实施跨领域关注是一个方面。
- 定义切入点以指示必须在哪个方面应用方面。
它确保在一个内聚代码组件中定义跨领域关注点。
行动计划
AOP(面向方面的编程)是一种编程模式, 可通过允许跨领域关注点分离来提高模块化。这些横切关注点与主要业务逻辑不同。我们可以在不修改代码本身的情况下向现有代码添加其他行为。
Spring的AOP框架可帮助我们实现这些跨领域的关注。
使用AOP, 我们可以在一处定义通用功能。我们可以自由定义应用此功能的方式和位置, 而无需修改应用新功能的类。现在, 可以将横切关注点模块化为特殊类, 称为方面。
方面有两个好处:
- 首先, 每个关注点的逻辑现在都集中在一个地方, 而不是分散在整个代码库中。
- 其次, 业务模块仅包含主要关注的代码。次要关注点已移至该方面。
这些方面具有要实施的职责, 称为建议。我们可以在一个或多个连接点将方面的功能实现到程序中。
AOP的好处
- 它是用纯Java实现的。
- 不需要特殊的编译过程。
- 它仅支持方法执行连接点。
- 仅运行时编织可用。
- 有两种类型的AOP代理:JDK动态代理和CGLIB代理。
跨领域关注
横切关注点是我们要在应用程序中的多个地方实现的关注点。它影响整个应用程序。
AOP术语
- 方面:方面是一个封装建议和切入点并提供跨切面的模块。应用程序可以具有许多方面。我们可以使用带有@Aspect注释的常规类来实现方面。
- 切入点:切入点是一种表达式, 它选择一个或多个执行建议的连接点。我们可以使用表达式或模式定义切入点。它使用与连接点匹配的不同类型的表达式。在Spring Framework中, 使用AspectJ切入点表达语言。
- 连接点:连接点是应用程序中应用AOP方面的点。或它是建议的特定执行实例。在AOP中, 连接点可以是方法执行, 异常处理, 更改对象变量值等。
- 建议:建议是我们在方法执行之前或之后执行的操作。该动作是在程序执行期间调用的一段代码。 Spring AOP框架中有五种类型的建议:之前, 之后, 返回之后, 抛出后以及周围的建议。针对特定的连接点提供建议。我们将在本节中进一步讨论这些建议。
- 目标对象:在其上应用建议的对象称为目标对象。目标对象始终是代理对象, 这意味着在运行时将创建一个覆盖目标方法的子类, 并根据其配置包含建议。
- 编织:这是将各方面与其他应用程序类型链接的过程。我们可以在运行时, 加载时和编译时执行编织。
代理:这是在将建议应用于目标对象之后创建的对象, 称为代理。 Spring AOP实现了JDK动态代理, 以使用目标类和建议调用创建代理类。这些称为AOP代理类。
AOP与OOP
AOP和OOP之间的区别如下:
AOP | OOP |
---|---|
方面:封装切入点, 建议和属性的代码单元。 | 类:封装方法和属性的代码单元。 |
切入点:它定义了在其中执行建议的一组入口点。 | 方法签名:它定义了执行方法主体的入口点。 |
建议:这是跨领域关注点的实现。 | 方法主体:它是业务逻辑关注点的实现。 |
Waver:借助建议构造代码(源或对象)。 | 编译器:它将源代码转换为目标代码。 |
Spring AOP与AspectJ
AOP和OOP之间的区别如下:
Spring AOP | AspectJ |
---|---|
需要单独的编译过程。 | 它需要AspectJ编译器。 |
它仅支持方法执行切入点。 | 它支持所有切入点。 |
它可以在Spring Container管理的bean上实现。 | 可以在所有域对象上实现它。 |
它仅支持方法级别编织。 | 它可以波动字段, 方法, 构造函数, 静态初始化器, 最终类等。 |
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框架。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
在下一节中, 我们将在应用程序中实现不同的建议。
评论前必须登录!
注册