AOP-流程 & AOP-连接点 & AOP-@Pointcut()

单切面:
正常链路:前置通知 -> 目标方法执行 -> 返回通知 -> 后置通知
异常链路:前置通知 -> 目标方法执行 -> 异常通知 -> 后置通知
多切面:
按照切面优先级,@Order(1) 指定优先级,数字越小优先级越高,越是代理最外层
后置像finally一样一定执行

![[2025-10-10_19-34-37-0.png]]

JoinPoint连接点信息,
/**

  • 告诉Spring当前类是一个切面类
  • 告诉Spring,以下通知方法,何时何地被调用
  • 何时?
  • @Before 在目标方法之前运行
  • @After 在目标方法之后运行
  • @AfterReturning 运行在目标方法正常返回之后
  • @AfterThrowing 运行在目标方法抛出异常之后
  • @Around 以上的四合一,可以修改返回值
  • 何地?
  • execution(public * com.atguigu.spring.aop..(..))
    */

@Pointcut 是 Spring AOP 中用于定义切入点的注解,它可以精确指定哪些方法需要被增强(织入通知逻辑)。其核心作用是集中定义切入点表达式,供 @Before@After@Around 等通知注解复用,避免重复编写表达式。

基本用法

  1. 定义切入点:在一个==空方法==上使用 @Pointcut,方法体通常为空(仅作为切入点的 “标识”)。
  2. 引用切入点:在通知注解中通过方法名引用该切入点。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;

@Aspect // 标识这是一个切面类
public class LogAspect {

// 1. 定义切入点:匹配 com.example.service 包下所有类的所有方法
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethod() {} // 方法名即切入点标识,无实际逻辑

// 2. 引用切入点:对 serviceMethod() 匹配的方法执行前置通知
@Before("serviceMethod()")
public void beforeService() {
System.out.println("方法执行前的日志...");
}
}

对于@Around的注意

2025-10-14_23-26-19-0.png
如图所示,此时如果目标方法异常,环绕通知给出的是 异常通知,而日志通知则给出的是 返回通知,并没有报错。

原因:
此时,环绕通知 对于 日志 来说,就相当于目标方法,也就是说,环绕通知 是 日志的目标方法,环绕通知 此时用 try-catch 把异常“吞”掉了,所以对于 日志来说,是没有异常的。
所以,为了 多切面情况下异常感知链路是通的,建议环绕通知一定抛出异常。