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>
关键点解析:
- 定义业务对象 Bean:
sampleAdder
- 定义切面 Bean:
doAfterReturningAspect
- 使用
<aop:config>
配置 AOP:- 通过
ref
关联切面 Bean - 定义切入点表达式:
execution(* org.baeldung.logger.SampleAdder+.*(..))
✅ 匹配SampleAdder
类所有方法(任意参数/返回值) - 绑定后置返回增强:
- 调用切面中的
afterReturn
方法 - 通过
returning
属性接收返回值
- 调用切面中的
- 通过
⚠️ XML 并非唯一选择,AspectJ 注解 也完全支持。
4.7 配置速览
使用 <aop:config>
标签定义 AOP 配置:
- 切面声明:通过
<aop:aspect>
关联切面 Bean - 切入点定义:使用
<aop:pointcut>
指定匹配规则- 示例表达式:
execution(* org.baeldung.logger.SampleAdder+.*(..))
- 示例表达式:
- 增强绑定:通过
<aop:after-returning>
等标签关联增强方法method
:指定切面中的方法名returning
:接收目标方法返回值
Spring AOP 支持多种增强类型(基于注解配置),更多示例见:
5. 总结
本文介绍了 AOP 的核心概念,并通过示例展示了 Spring AOP 模块的使用。深入学习可参考以下资源:
示例代码见 GitHub 仓库