1. 引言

本教程将介绍 Spring AOP(面向切面编程),并学习如何在实际场景中使用这个强大工具。开发 Spring AOP 时也可以利用 AspectJ 的注解,但本文将专注于基于 XML 的核心 Spring AOP 配置。

2. 概览

AOP 是一种编程范式,通过分离横切关注点来提升模块化程度。 它在不修改现有代码的情况下,通过添加额外行为实现这一目标。我们可以将新代码和新行为分开声明。

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

3. Maven 依赖

首先在 pom.xml 中添加 Spring AOP 库的依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
</parent>
 
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

最新版本可在此处查看:Maven 仓库

4. AOP 概念与术语

快速过一遍 AOP 的核心概念和术语:

程序执行流程图

4.1 业务对象

业务对象是包含普通业务逻辑的类。下面是一个简单的加法业务对象示例:

public class SampleAdder {
    public int add(int a, int b) {
        return a + b;
    }
}

注意:这是一个纯业务逻辑类,没有任何 Spring 相关注解。

4.2 切面(Aspect)

切面是对横跨多个类的关注点的模块化。统一日志就是典型的横切关注点示例。

定义一个简单切面:

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 连接点(Joinpoint)

连接点是程序执行过程中的特定点,如方法执行或异常处理。
在 Spring AOP 中,连接点始终表示方法执行。

4.4 切入点(Pointcut)

切入点是一个谓词,用于匹配切面在特定连接点应用的增强(Advice)。
通常将增强与切入点表达式关联,该表达式会在所有匹配的连接点上运行。

4.5 增强(Advice)

增强是切面在特定连接点执行的动作。常见类型包括:

  • around(环绕)
  • before(前置)
  • after(后置)

在 Spring 中,增强被建模为拦截器,在连接点周围维护拦截器链。

4.6 织入业务对象与切面

现在看如何将业务对象与后置返回增强(After-Returning Advice)的切面织入:

在 Spring 配置文件的 <beans> 标签中添加以下配置:

<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>

关键点解析:

  1. 定义业务对象 Bean:sampleAdder
  2. 定义切面 Bean:doAfterReturningAspect
  3. 使用 <aop:config> 配置 AOP:
    • 通过 ref 关联切面 Bean
    • 定义切入点表达式:execution(* org.baeldung.logger.SampleAdder+.*(..))
      ✅ 匹配 SampleAdder 类所有方法(任意参数/返回值)
    • 绑定后置返回增强:
      • 调用切面中的 afterReturn 方法
      • 通过 returning 属性接收返回值

⚠️ XML 并非唯一选择,AspectJ 注解 也完全支持。

4.7 配置速览

使用 <aop:config> 标签定义 AOP 配置:

  1. 切面声明:通过 <aop:aspect> 关联切面 Bean
  2. 切入点定义:使用 <aop:pointcut> 指定匹配规则
    • 示例表达式:execution(* org.baeldung.logger.SampleAdder+.*(..))
  3. 增强绑定:通过 <aop:after-returning> 等标签关联增强方法
    • method:指定切面中的方法名
    • returning:接收目标方法返回值

Spring AOP 支持多种增强类型(基于注解配置),更多示例见:

5. 总结

本文介绍了 AOP 的核心概念,并通过示例展示了 Spring AOP 模块的使用。深入学习可参考以下资源:

示例代码见 GitHub 仓库


原始标题:Introduction to Spring AOP