当前位置: 首页 > news >正文

Spring AOP 切点设计实战:execution vs @annotation

一、前言

在学习 Spring AOP 时,很多人最先接触的是:

@Around("execution(* com.xxx.service..*(..))")

但随着项目复杂度提升,你会开始看到另一种写法:

@Around("@annotation(operationLog)")

这时候就会产生一个非常典型的疑问:

❗ execution 和 @annotation 到底有什么区别?是不是重复了?

如果你只是停留在“语法层”,你会觉得:

只是两种写法而已

但如果从工程角度看,这其实是一个非常关键的设计问题。


二、核心结论(先给答案)

先记住这一句:

execution = 按“代码位置”拦截(全局) @annotation = 按“标记”拦截(精确)

企业项目中,真正的用法是:

execution + @annotation 组合使用

三、execution:按“代码位置”拦截

1. 基本写法

@Around("execution(* com.xxx.modules..controller..*(..))")

2. 含义拆解

execution( * 任意返回值 com.xxx.modules 指定包 .. 子包 controller.. controller 层 *.* 所有类的所有方法 (..) 任意参数 )

👉 本质:

按“包路径”拦截

3. 适合场景

✔ 请求日志(所有接口都要记录) ✔ 统一监控 ✔ 全局增强

4. 举例

@Around("execution(* com.xxx.modules..controller..*(..))") public Object log(ProceedingJoinPoint joinPoint) { // 所有接口都会进来 }

四、@annotation:按“标记”拦截

1. 基本写法

@Around("@annotation(operationLog)")

2. 含义

只拦截“带某个注解的方法”

3. 使用方式

第一步:定义注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface OperationLog { String module() default ""; String action() default ""; }

第二步:标记方法
@OperationLog(module = "用户模块", action = "创建用户") @PostMapping("/create") public Result<Void> createUser() { return Result.success(); }

第三步:AOP 拦截
@Around("@annotation(operationLog)") public Object operationLog(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable { log.info("操作日志:module={}, action={}", operationLog.module(), operationLog.action()); return joinPoint.proceed(); }

👉 本质:

按“标记”拦截

五、为什么 execution 不够用(关键)

假设有一个 Controller:

20 个接口

但真正需要记录“操作日志”的只有:

创建用户 删除用户 支付 退款

❌ 如果用 execution

@Around("execution(* com.xxx.modules.user.controller..*(..))")

结果:

20 个接口全部被拦截 ❌

✅ 正确做法:@annotation

@OperationLog(...)

👉 只给关键接口打标记:

精准控制

六、企业项目的真实用法(重点)

实际项目不会只用一种,而是组合:


1️⃣ 请求日志(全局)

@Around("execution(* com.xxx.modules..controller..*(..))")

👉 所有接口都记录日志


2️⃣ 操作日志(关键接口)

@Around("@annotation(operationLog)")

👉 只记录关键操作


3️⃣ 权限控制

@Around("@annotation(checkPermission)")

4️⃣ 限流

@Around("@annotation(rateLimit)")

👉 总结:

execution → 全局能力 @annotation → 精细控制

七、组合写法(面试加分)

你甚至可以组合:

@Around("execution(* com.xxx.modules..controller..*(..)) && @annotation(operationLog)")

含义:

只拦 controller 层 + 且带注解的方法

八、设计思路总结(最重要)

execution = 扫一片(全拦) @annotation = 点名(精确) 企业项目 = execution + @annotation 组合

九、常见误区

❌ 误区1:只会 execution

所有接口都被拦 无法精细控制

❌ 误区2:只用 @annotation

每个接口都要加注解 维护成本高

❌ 误区3:不区分场景

日志、权限、限流全部混在一起

十、面试怎么说(直接可用)

如果面试官问:

你项目里 AOP 怎么用的?

可以这样回答:

我在项目中区分了两种切点方式。

execution 主要用于全局能力,比如请求日志,我会在 controller 层统一拦截所有接口。

@annotation 主要用于精细控制,比如操作日志、权限校验、限流,我会通过自定义注解标记关键接口,然后通过 AOP 进行拦截。

在实际项目中,我是将 execution 和 @annotation 组合使用,从而实现全局能力和精细控制的统一。


十一、总结

这篇文章最核心的不是语法,而是设计思路:

AOP 的价值,不是“能拦截”,而是“如何优雅地控制拦截范围”

最终你要做到的是:

全局能力 → execution 关键能力 → @annotation 工程落地 → 两者组合

十二、延伸

如果你已经看完前几篇:

Spring AOP 从原理到实战(结合事务彻底搞懂)

Spring AOP 进阶实战:从日志到权限/链路追踪/限流(真正企业用法)

Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包

AOP 原理 AOP 工程化 统一返回 + 异常处理

那么这一篇补齐的是:

AOP 切点设计能力

这一步非常关键,因为:

从“会用 AOP” 到“会设计 AOP”

这就是中级工程师的分水岭。

http://www.jsqmd.com/news/705172/

相关文章:

  • 深度解析 2026 年南京办公室装修为何推荐南京力天装饰 - 小艾信息发布
  • C++的输入和输出流详解
  • 【多旋翼无人机姿态估计】适用于无人机的姿态估计算法,聚焦于线性与非线性姿态估计器的开发与测试,以及在不同飞行条件与环境下的估计
  • AI搜索优化实战:深度评测杭州爱搜索GEO营销系统,如何让工业制造企业成为AI大模型的“标准答案”
  • 【MCP 2026多模态实战白皮书】:首发3大工业级数据对齐范式与实时推理加速方案
  • 医师资格证考试培训推荐|备考党必看!避坑+高效提分攻略(亲测实用) - 品牌测评鉴赏家
  • LRCGet:让本地音乐库拥有完美同步歌词的终极解决方案
  • RE-UE4SS终极指南:3步解锁Unreal Engine游戏无限潜力
  • CURD系统如何做出技术含量?
  • 2026执医备考刷题怎么选?盘点5款考生常用工具,助你避开误区高效复习 - 品牌测评鉴赏家
  • 从45分钟到5分钟:Brigadier如何重构企业级Boot Camp自动化部署架构
  • LFM2.5-1.2B-Instruct部署教程:ARM64架构Linux系统兼容部署方案
  • Redis高级笔记:原理+集群+应用+拓展+源码
  • 2025最权威的降AI率神器推荐榜单
  • 基于OpenFOAM-extend的风-浪联合作用数值模拟:kOmega湍流模型的效率优先实现
  • 如何快速获取中兴光猫完整权限:新手友好的终极指南
  • 终极实战:5个高效微信自动化场景,用wxauto构建你的智能机器人
  • 2026年广州装饰装修公司口碑推荐:办公室、厂房、商铺、酒店会所及网红基地、美容院装修优选指南 - 海棠依旧大
  • 基于SpringBoot的房产销售系统设计与实现(附源码+数据库+文档,一键运行)
  • 终极指南:如何用Windhawk轻松定制你的Windows系统界面与功能
  • Keras函数式API实战:构建复杂深度学习模型
  • 昭昭题库实测解析:是否靠谱?(附详细说明) - 品牌测评鉴赏家
  • 5个核心功能+3种应用场景:NSC_BUILDER让您的Switch游戏管理更高效
  • 2026昭昭题库详细解析 - 品牌测评鉴赏家
  • 034、监控与可观测性:日志、指标与追踪
  • 基于ETAP的110kV变电站无功补偿与谐波抑制仿真研究 - 代码复现
  • 2026届毕业生推荐的五大降AI率平台横评
  • R语言实现惩罚回归:原理、对比与实战案例
  • M-LAG 实验
  • 蓝桥杯STC15单片机PCA定时器配置避坑指南:从CMOD到中断函数,这些细节别搞错