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 中添加 SpringAOP 库依赖:

<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,它表示业务对象的一个​​实例。此外,我们正在创建一个名为 AdderAfterReturnAspectAspect 实例。

当然,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 的更多信息,这里有一些资源:

这些示例的实现可以在 GitHub 项目中找到——这是一个基于 Maven 的项目,因此应该很容易导入和按原样运行。

以上是关于Spring AOP 简介的主要内容,如果未能解决你的问题,请参考以下文章

Spring AOP 简介

Spring AOP 简介

Spring使用指南 ~ 5Spring AOP 使用简介

Spring使用指南 ~ 5Spring AOP 使用简介

Spring中AOP简介与使用

Spring-----AOP简介