Spring AOP 扫盲(概念篇)

简介: Spring AOP 是 Spring 框架的重要特性之一。本文介绍了一些 Spring AOP 相关的基础概念和原理,适合初学者阅读。

相关链接:Spring AOP 扫盲(应用篇)

Spring AOP 简介

AOP 是 Aspect-oriented programming 的简称,意为面向切面编程。它可以将跨越多个业务模块的相似特性,单独抽取出来,形成独立的模块,与业务模块更好地解藕,常见的使用场景有日志、事务管理、性能监控等。

Spring AOP 是 Spring 框架对 AOP 特性的支持。Spring 框架最为人熟知的两大特性就是 IOC 和 AOP,其中 IOC 特性是通过 Spring 容器来实现的,它也是 Spring 框架的「地基」。

Spring 的 AOP 特性也是在 IOC 的基础上实现的,而且,Spring AOP 并不致力于提供完备的面相切面编程的功能,而是让 Spring 的 IOC 特性能更好地服务于应用开发。因此,我觉得 AOP 并不算是与 IOC 并列的 Spring 特性,而是 IOC 容器特性的增强。

以下是 Spring 框架的架构图,也可以看到 AOP 其实是基于核心容器的更上层的特性。

image.png

Spring AOP 相关概念

下面对 Spring AOP 特性中涉及到的关键概念做一个简单的解释。

Aspect

通常被翻译为切面,虽然把英文翻译成了中文,但对于不了解 AOP 的初学者来说,依然是一个无法理解的概念,相当于没翻译。它指的是,使用一个独立的增强模块,对其他多个独立的不同业务模块进行增强的过程,也就是 AOP 发生作用的过程。

举个例子,比如我们有个包含多个独立业务模块的系统,现在需要对所有业务模块增加性能监控的特性,如果不使用 AOP 特性,就需要在每个业务模块中增加性能监控的逻辑,而通过 AOP 特性,可以单独开发一个性能监控的增强模块,然后使用这个增强模块对所有的业务模块进行增强,这个过程就叫做 Aspect。

再举一个形象但是不一定恰当的类比,比如你正在吃一个汉堡,你觉得汉堡里的肉太少了,你想让你吃的每一口汉堡中肉能再多一点,你并不需要每吃一口汉堡是再另外吃一块肉,而是往汉堡里再多加一个肉饼,这样,你之后吃的每一口汉堡中的肉都增加了。这个往汉堡里额外夹一块肉饼的过程,就叫 Aspect。希望我讲明白了。

在 Spring AOP 中,被增强的通常是一个方法。

Join point

通常叫做连接点,在 Spring AOP 中,一个方法的执行就是一个 Join point。也可以说,一个 Join point 就是一个可以被增强的对象,比如一个汉堡。

Point cut

也叫切入点,根据 Spring 官方文档中的解释,Point cut 是用来匹配 Join point 的谓词。也就是说,它可以用来匹配要被增强的连接点。在 Spring 中,一个切入点通常是用一个表达式来表示的,Spring 默认使用的是 AspectJ 的切入点表达式语言。(顺便介绍一下,AspectJ 是一个独立的 AOP 框架)

举个例子:execution(* com.xyz.service.AccountService.*(..)) 就是一个 AspectJ 的切入点表达式,它可以用来匹配定义在com.xyz.service.AccountService类中的所有方法。

Advice

前面我们一直在提一个词「增强」,Advice 就是增强本强,上面几个概念的介绍中,我们知道了,切面就是对切入点匹配到的连接点进行增强的过程,那什么是增强呢?比如我们要使用 AOP 的方式,给所有的业务请求增加性能监控的模块,那么这个性能监控的功能就叫做增强,也就是给目标连接点额外增加的执行逻辑,也就是汉堡例子中,额外增加的那一个肉饼。

在 Spring AOP 中,Advice 分几种类型。

  • Before(前置增强):在目标方法执行前执行
  • After(后置增强):在目标方法执行后执行(无论是否有异常抛出)
  • AfterThrowing(异常抛出增强):在目标方法抛出异常时执行
  • AfterReturning(返回后增强):在目标方法执行后执行(没有异常抛出)
  • Around(环绕增强):在目标方法执行前后分别执行增强逻辑,甚至可以决定是否执行切入点方法。

这些增强逻辑的执行顺序是这样的:

  • 当目标方法正常执行完(不抛出异常)的情况下:环绕增强的前段逻辑 -> 前置增强 -> 目标方法逻辑 -> 返回后增强 -> 后置增强 -> 环绕增强的后段逻辑
  • 当目标方法抛出异常的情况下:环绕增强的前段逻辑 -> 前置增强 -> 目标方法逻辑 -> 异常抛出增强 -> 后置增强

知道了以上这几个概念,就能理解 AOP 的基本逻辑了。

Spring 实现 AOP 的方式

Spring 实现 AOP 特性的方式是通过 JDK 动态代理或者 cglib 动态代理,在代理方法中添加增强的逻辑。作为一个纯 Java 当 AOP 框架,Spring 对目标方法的增强,都是在运行时完成的。

总结

本文介绍了一些 Spring AOP 相关的基础概念和原理,适合初学者阅读。


目录
相关文章
|
7天前
|
运维 Java 程序员
Spring5深入浅出篇:基于注解实现的AOP
# Spring5 AOP 深入理解:注解实现 本文介绍了基于注解的AOP编程步骤,包括原始对象、额外功能、切点和组装切面。步骤1-3旨在构建切面,与传统AOP相似。示例代码展示了如何使用`@Around`定义切面和执行逻辑。配置中,通过`@Aspect`和`@Around`注解定义切点,并在Spring配置中启用AOP自动代理。 进一步讨论了切点复用,避免重复代码以提高代码维护性。通过`@Pointcut`定义通用切点表达式,然后在多个通知中引用。此外,解释了AOP底层实现的两种动态代理方式:JDK动态代理和Cglib字节码增强,默认使用JDK,可通过配置切换到Cglib
|
14天前
|
安全 Java 测试技术
Spring Boot集成支付宝支付:概念与实战
【4月更文挑战第29天】在电子商务和在线业务应用中,集成有效且安全的支付解决方案是至关重要的。支付宝作为中国领先的支付服务提供商,其支付功能的集成可以显著提升用户体验。本篇博客将详细介绍如何在Spring Boot应用中集成支付宝支付功能,并提供一个实战示例。
36 2
|
14天前
|
Java 关系型数据库 数据库
Spring Boot多数据源及事务管理:概念与实战
【4月更文挑战第29天】在复杂的企业级应用中,经常需要访问和管理多个数据源。Spring Boot通过灵活的配置和强大的框架支持,可以轻松实现多数据源的整合及事务管理。本篇博客将探讨如何在Spring Boot中配置多数据源,并详细介绍事务管理的策略和实践。
37 3
|
21小时前
|
XML Java 数据格式
Spring高手之路18——从XML配置角度理解Spring AOP
本文是全面解析面向切面编程的实践指南。通过深入讲解切面、连接点、通知等关键概念,以及通过XML配置实现Spring AOP的步骤。
21 6
Spring高手之路18——从XML配置角度理解Spring AOP
|
5天前
|
JavaScript Java 开发者
Spring Boot中的@Lazy注解:概念及实战应用
【4月更文挑战第7天】在Spring Framework中,@Lazy注解是一个非常有用的特性,它允许开发者控制Spring容器的bean初始化时机。本文将详细介绍@Lazy注解的概念,并通过一个实际的例子展示如何在Spring Boot应用中使用它。
18 2
|
7天前
|
XML Java 数据格式
Spring使用AOP 的其他方式
Spring使用AOP 的其他方式
15 2
|
7天前
|
XML Java 数据格式
Spring 项目如何使用AOP
Spring 项目如何使用AOP
20 2
|
12天前
|
Java 开发者 Spring
Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
【5月更文挑战第1天】Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
24 5
|
12天前
|
XML Java 数据格式
Spring AOP
【5月更文挑战第1天】Spring AOP
27 5
|
12天前
|
Java 编译器 开发者
Spring的AOP理解
Spring的AOP理解