Spring AOP核心是四个概念协同:切面(@Aspect类)封装横切逻辑,切点(Pointcut表达式)定位拦截位置,通知(Advice)定义增强动作(Before/After/Around等五种),连接点(JoinPoint)指实际被拦截的方法执行点。

Spring AOP 的核心不是写一堆代理代码,而是用清晰的分工把“横切逻辑”从业务中剥离出来。关键在于四个概念各司其职:切面是容器,切点定位置,通知写逻辑,连接点是实际发生的地方。
切面(Aspect):横切关注点的封装单元
它不是一个抽象概念,而是一个实实在在的类——用 @Aspect 标记的 Spring Bean。这个类里既定义了“在哪增强”(切点),也定义了“怎么增强”(通知)。比如日志、事务、权限校验这类跨多个业务方法的通用逻辑,就该打包进一个切面类里统一管理。
- 必须配合 @Component 或手动注册为 Spring Bean,否则不会被识别
- 一个切面可以包含多个切点和多种通知,但不强制一对一
- 本质是“切点 + 通知”的组合体,不是单纯的方法集合
切点(Pointcut):精确匹配要拦截的方法
它是一条表达式规则,告诉 Spring “哪些方法需要被增强”。写在 @Pointcut 注解里,本身不执行任何逻辑,只做匹配判断。常见的写法如 execution(* com.example.service..*.*(..)) 表示匹配 service 包下所有类的所有方法。
- 切点表达式支持通配符、包路径、返回类型、方法名、参数列表等组合
- 可以复用:一个切点可被多个通知引用;也可用 &&、||、! 组合多个切点
- 注意:Spring AOP 的切点只能匹配到 public 方法的执行(因为基于代理)
通知(Advice):真正要执行的增强逻辑
它是切面里的具体方法,定义了“在什么时候、做什么”。Spring 提供五种类型,区别在于触发时机和是否影响原方法执行:
立即学习“Java免费学习笔记(深入)”;
- @Before:方法调用前执行,不能阻止方法执行
- @After:方法调用后执行(无论成功或异常),无法获取返回值
- @AfterReturning:仅当方法正常返回时执行,可通过 returning 属性接收返回值
- @AfterThrowing:仅当方法抛出指定异常时执行,可通过 throwing 获取异常对象
- @Around:最灵活,包裹整个方法执行,必须显式调用 proceed() 才能触发原方法
连接点(Join Point):程序中可被拦截的具体执行点
在 Spring AOP 中,连接点特指某个方法的执行过程。它是一个运行时概念,代表一个真实发生的位置。比如 UserService 的 save() 方法被调用时,这个调用动作就是一个连接点。
- 不是所有连接点都会被增强,只有匹配切点表达式的才是“接入点”
- 通知方法的参数(如 JoinPoint 或 ProceedingJoinPoint)就是用来访问当前连接点信息的
- Spring 不支持字段访问、构造器调用等其他类型的连接点(这是 AspectJ 的能力)
这四个概念串起来就是:Spring 在运行时扫描所有 bean,发现带 @Aspect 的类 → 解析其中的 @Pointcut 表达式 → 找到所有匹配的连接点(即符合条件的方法调用)→ 对这些连接点织入对应的通知逻辑 → 最终通过 JDK 动态代理或 CGLIB 创建代理对象来实现。



















