Spring AOP 简介
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring AOP 简介相关的知识,希望对你有一定的参考价值。
Spring AOP 简介
翻译原文链接 Introduction to Spring AOP
1. 简介
在本教程中,我们将通过 Spring 介绍 AOP(面向切面的编程),并开始了解如何在实际场景中开始使用这个强大的工具。
在使用 Spring AOP 进行开发时,也可以利用 AspectJ 的注解,但在本文中,我们关注核心 Spring AOP 基于 XML 的配置。
2. 概述
AOP 是一种编程范式,旨在通过允许分离横切关注点来增加模块化。它通过向现有代码添加额外行为而不修改代码本身来实现。
相反,我们可以分别声明这个新代码和这些新行为。
Spring 的 AOP 框架帮助我们实现这些横切关注点。
3. Maven 依赖项
我们首先在 pom.xml 中添加 Spring 的 AOP 库依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
可以在此处检查依赖项的最新版本。
4. AOP 概念和术语
让我们简要回顾一下 AOP 特有的概念和术语:
4.1. 业务对象
业务对象是具有正常业务逻辑的普通类。让我们看一个简单的业务对象示例,其中我们只将两个数字相加:
public class SampleAdder
public int add(int a, int b)
return a + b;
注意这个类是一个普通的类,有业务逻辑,没有任何Spring相关的注解。
4.2. 切面
切面是跨越多个类的关注点的模块化(类)。统一日志记录就可以是这种横切关注点的一个例子。
让我们看看如何定义一个简单的切面:
public class AdderAfterReturnAspect
private Logger logger = LoggerFactory.getLogger(this.getClass());
public void afterReturn(Object returnValue) throws Throwable
logger.info("value return was ", returnValue);
在上面的例子中,我们刚刚定义了一个简单的 Java 类,它有一个叫做 afterReturn 的方法,它接受一个 Object 类型的参数,它只记录那个值。请注意,即使我们的 AdderAfterReturnAspect (也只)是一个标准类,没有任何 Spring 注解。
在接下来的部分中,我们将看到如何将此切面连接到我们的业务对象。
4.3. 连接点
连接点是程序执行过程中的一个点,例如方法的执行或异常的处理。
在 Spring AOP 中,一个连接点 始终代表一个方法执行。
4.4. 切点
切点是一个谓词,它有助于匹配一个由特定连接点处的切面应用的通知。 A Pointcut is a predicate that helps match an Advice to be applied by an Aspect at a particular JoinPoint.
通知 通常与一个切点表达式相关联,并在与切点匹配的任何连接点上运行。
4.5. 通知
通知 是切面在特定连接点处采取的行动。不同类型的通知包括环绕、前置 和 后置 通知。
在 Spring 中,一个 通知 被建模为一个拦截器,在连接点周围维护一个拦截器链。
4.6. 连接业务对象和切面
让我们看看如何使用返回后通知将业务对象连接到切面。
下面是我们将在 <beans>
标签中放置在标准 Spring 配置中的配置摘录:
<bean id="sampleAdder" class="org.baeldung.logger.SampleAdder" />
<bean id="doAfterReturningAspect"
class="org.baeldung.logger.AdderAfterReturnAspect" />
<aop:config>
<aop:aspect id="aspects" ref="doAfterReturningAspect">
<aop:pointcut id="pointCutAfterReturning" expression=
"execution(* org.baeldung.logger.SampleAdder+.*(..))"/>
<aop:after-returning method="afterReturn"
returning="returnValue" pointcut-ref="pointCutAfterReturning"/>
</aop:aspect>
</aop:config>
可以看出,我们定义了一个名为 simpleAdder 的简单 bean,它表示业务对象的一个实例。此外,我们正在创建一个名为 AdderAfterReturnAspect 的 Aspect 实例。
当然,XML 不是我们唯一的选择;如前所述,也完全支持 AspectJ 注释。
4.7. 配置概览
标签 aop:config
用于定义 AOP 相关的配置。在 config
标签中,我们定义了代表一个切面的类。我们已经给它一个我们创建的 doAfterReturningAspect 切面 bean 的引用。
接下来,我们使用 aop:pointcut
标签定义一个切点。上例中使用的切点(表达式)是 execution(* org.baeldung.logger.SampleAdder+.*(..))
这意味着对 SampleAdder 类中的任何方法应用建议,该方法接受任意数量的参数并返回任何值类型。
然后,我们定义要应用的通知。在上面的示例中,我们将通过执行使用属性方法定义的名为 afterReturn 的方法来应用在我们的切面 AdderAfterReturnAspect 中定义的 返回后通知。
切面 中的这个 通知 采用一个 Object 类型的参数。该参数使我们有机会在目标方法调用之前 和/或 之后采取行动。在这个案例里,我们只记录方法的返回值。
Spring AOP 支持使用基于注解的配置的多个通知——可以在 Spring 中的Advice类型介绍 和 Spring 中的切点表达式介绍 找到这个和更多的例子。
5. 总结
在本教程中,我们阐释了 AOP 中使用的概念以及使用 Spring 的 AOP 模块的示例。如果您有兴趣了解有关 AOP 的更多信息,这里有一些资源:
- An introduction to AspectJ
- Implementing a Custom Spring AOP Annotation
- An introduction to Pointcut Expressions in Spring
- Comparing Spring AOP and AspectJ
- An introduction to Advice Types in Spring
这些示例的实现可以在 GitHub 项目中找到——这是一个基于 Maven 的项目,因此应该很容易导入和按原样运行。
以上是关于Spring AOP 简介的主要内容,如果未能解决你的问题,请参考以下文章