Skip to content

02.2 — AOP 核心概念与 Advice

定位: AOP 体系中的核心术语、Advice 类型和 Pointcut 表达式 面试高频度: ⭐⭐⭐⭐ 考查方式: 术语理解、Advice 执行顺序、Pointcut 表达式编写

一、这是什么?为什么需要它?

AOP 提供了一组标准化术语来描述"在哪里增强"和"增强什么"——Join Point(所有可能的位置)、Pointcut(筛选条件)、Advice(增强逻辑)。

二、原理拆解

2.1 AOP 核心术语

术语中文说明类比
Join Point连接点程序执行中的某个点(方法调用、异常抛出)所有可能的位置
Pointcut切点匹配连接点的表达式,决定增强应用到哪些方法筛选条件
Advice通知/增强在切点上执行的具体逻辑要执行的动作
Aspect切面Pointcut + Advice 的组合完整的切面定义
Weaving织入将切面应用到目标对象的过程组装过程
Target目标对象被增强的对象被代理的对象
Introduction引入为类添加新的方法和属性动态接口实现

2.2 Advice 类型

注解说明典型用途
@Before方法执行前参数校验、权限检查
@AfterReturning方法正常返回后日志记录、数据审计
@AfterThrowing方法抛出异常后异常通知、告警
@After方法结束后 (finally)资源清理
@Around包裹方法,可控制何时执行事务、缓存、性能监控

2.3 Advice 执行顺序

调用方 -> @Around(proceed前) -> @Before -> 目标方法 -> @AfterReturning -> @After -> @Around(proceed后) -> 返回
如果抛出异常:@AfterThrowing 替代 @AfterReturning

多个 Aspect 的执行顺序通过 @Order 控制,值越小优先级越高。

2.4 Pointcut 表达式

指示符说明示例
execution匹配方法执行execution(* com.example.service..(..))
within匹配指定类型内within(com.example.service..*)
annotation匹配有指定注解的方法@annotation(org.springframework.transaction.annotation.Transactional)
args匹配参数类型args(java.lang.String, ..)
beanSpring Bean 名称匹配bean(userService)
java
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayer() {}

@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
public void transactional() {}

// 组合
@Before("serviceLayer() && !transactional()")
public void beforeService(JoinPoint jp) {
    // 应用于 service 层但排除事务方法
}

三、面试视角

追问答案要点
@Around 和 @Before/@After 执行顺序?Around(before) -> Before -> 目标 -> AfterReturning -> After -> Around(after)
execution 和 within 区别?execution 匹配方法签名,within 匹配类所在的包
多个 Aspect 如何控制顺序?@Order 注解,值越小优先级越高

📚 相关链接

  • **JDK动态代理与CGLIB** — AOP 的底层实现机制
  • **@Transactional原理** — @Transactional 底层是 Around Advice
  • ← 返回 **返回 AOP 索引**

Knowledge4J — Java 知识库