老铁们,上篇博客我们体验了 Spring AOP 的威力:轻轻松松就给所有 Controller 方法加上了耗时统计。但是,你是不是对 切点、连接点、通知、切面 这些概念还一头雾水?感觉它们像一堆飘在空中的术语,抓不住、摸不着?
别急,今天我们就把这些概念从天上拉到地上,用最生活的例子、最形象的画图,把它们掰开揉碎讲清楚。
一、Spring AOP的 概念
1. 四个概念
(1). 切点
(2). 切面
(3). 通知
(4). 连接点
咱们用下述的代码来举例子:


2. 举例说明概念
举个通俗的例子,比如一个老师要通知1班的学生在8:45上课,那假如我们有100个学生的话,那这个老师就得挨个挨个的发通知。这是比较麻烦的,于是呢,我们就建一个班级群,然后在班级里统一通知。
此时这里的连接点 就是:100个学生,比如张三、李四、王五,他们自己就是属于一个连接点。
我们的切点 就是这个1班的学生 (切点是一个表达式,所以我们叫1班的学生)。
我们的通知 是8:45上课 。
然后整个这件事情 我们就称之为切面。
那如果你还对此概念有一些模糊,那么不用着急,我们再举一个例子,老铁们继续往下读。
二、举例说明四个概念
1. 先从一个故事开始:图书馆的"统一还书提醒"
1.1 没有 AOP 的日子
假设你经营着一家图书馆,里面有几千本图书。每天都有很多读者来借书、还书。你发现一个问题:很多读者总是忘记还书日期,导致逾期。你想在每个读者还书的时候,顺便提醒他"下次记得按时还书哦"
最简单的办法:在每一个还书的方法里,加上一句提醒。
java
public void returnBook(Book book) {
// 还书的核心逻辑
updateBookStatus(book);
// 提醒
System.out.println("亲,记得按时还书哦");
}
但是,图书馆里有几十种还书方式:前台还书、自助机还书、APP还书......每个地方都要加。如果以后提醒文案改了,几十个地方都要改,累不累?
1.2 引入 AOP 后
AOP 的做法是:不修改任何还书代码,而是"在还书的时候自动附赠一句提醒"。就像你在超市买东西,收银员扫描商品后,小票上自动打印"谢谢惠顾"------收银员没有刻意去说,系统自动加的。
在 AOP 里:
- 连接点:所有可以加提醒的地方(前台还书、自助机还书、APP还书)------也就是所有可能被增强的方法。
- 切点:你只关心"还书"这个方法,不关心其他方法(比如借书、查书)。切点就是一条规则,告诉程序"只对还书方法进行增强"。
- 通知:具体要做的提醒动作------"亲,记得按时还书哦"。
- 切面 = 切点 + 通知 = "在还书时加上提醒"。
2. 核心概念逐一说(配图)
2.1 连接点(Join Point)------所有可能被切的地方
概念 :连接点是程序执行过程中的某个"点",比如方法调用、异常抛出、字段赋值等。在 Spring AOP 中,连接点通常指一个方法的执行。
生活例子:一座大楼里有无数个房间(方法),每个房间的门(方法入口)都是一个"连接点"。理论上,你可以在任何一扇门上贴广告。
画图理解:

一句话:连接点就是所有可以被 AOP 切入的地方。
2.2 切点(Pointcut)------我要切哪些地方
概念:切点是一组规则,用来筛选出你真正想增强的连接点。它就像一个"过滤器"。
生活例子 :你不想在每个房间门上贴广告,只想在"校长办公室"和"教导处"的门上贴。你定的规则就是"只贴这两扇门"。这个规则就是切点。
画图理解:

代码中 :切点表达式 execution(* com.zhongge.controller.*.*(..)) 就是规则。
一句话:切点就是"在众多连接点中,挑出我感兴趣的那些"。
2.3 通知(Advice)------我要做什么
概念:通知是具体的增强代码,也就是"你要做的事情"。它决定了在连接点的什么时机执行(前、后、环绕、异常等)。
生活例子 :你选定了"校长办公室"这扇门(切点),然后你决定在门上贴一张"欢迎光临"的贴纸(通知)。贴纸就是通知。
通知的类型(时机):
- 前置通知(@Before):进门之前贴。比如在方法执行前打印日志。
- 后置通知(@After):出门之后贴。无论方法是否成功,都执行。
- 返回后通知(@AfterReturning):正常出门后贴。只有方法正常返回才执行。
- 异常后通知(@AfterThrowing):摔了一跤出门后贴。只有方法抛异常才执行。
- 环绕通知(@Around):把整个门包起来,进门出门都能贴。最强大,可以控制方法是否执行。
画图理解:

一句话:通知就是"你要做的事 + 做事的时机"。
2.4 切面(Aspect)------切点 + 通知
概念:切面 = 切点 + 通知。它把"在哪里做"和"做什么"绑定在一起。
生活例子 :你制定了一条规则:"在校长办公室的门上(切点),贴一张'欢迎光临'的贴纸(通知)"。这条完整的规则就是切面。
画图理解:

一句话:切面就是"在哪些方法上,做什么事"。
3. 把这些概念串起来:一个完整的例子
假设我们要统计 BookController 中所有方法的执行耗时。
- 连接点 :
addBook()、queryBookById()、updateBook()、deleteBook()、batchDelete()等所有方法。 - 切点 :
execution(* com.zhongge.controller.BookController.*(..))------只选择 BookController 中的方法。 - 通知:记录开始时间、结束时间,计算差值并打印。
- 切面 :把切点和通知组合成一个
@Aspect类。
画图表示:

4. 一张图总结所有概念

老铁们,本期我们先简单对SpringAOP的概念进行具体化的理解~
后续内容干货满满,记得点赞👍+关注💖+收藏⭐,不迷路!
下一期,我们将对SpringAOP通知类型的详细用法 和 多个切面的执行顺序,敬请期待~🚀