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, ..) |
| bean | Spring 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 索引**