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

【Spring框架】别再死记硬背!AOP 原来这么简单

一、核心定义

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,核心思想是:将与业务核心逻辑无关,但多个模块都需要的通用功能(如日志、事务、权限校验)抽离出来,形成独立的「切面」,再通过「动态代理」的方式织入到业务代码中

用通俗的话讲:

  • 业务代码是「主线剧情」(比如用户下单、支付);
  • 日志、事务、权限是「背景音乐」(所有剧情都需要,但不是核心);
  • AOP就是把「
  • 背景音乐」

抽出来单独做,再自动加到每段「主线剧情」里,不用在每个业务方法里重复写。

二、AOP核心概念

先记住AOP的核心术语,再用「接口权限校验」的例子对应,

术语通俗解释例子(权限校验)
切面(Aspect)抽离出来的通用功能模块(包含通知+切点)「权限校验模块」就是一个切面
通知(Advice)切面的具体执行逻辑(何时执行)「校验用户token是否有效」的代码
切点(Pointcut)通知要织入的位置(哪些方法/类)所有/api/admin/*开头的接口方法
连接点(JoinPoint)程序执行过程中能插入切面的所有位置(如方法调用、异常抛出)每个admin接口的调用时刻都是连接点
织入(Weaving)将切面应用到目标对象的过程(编译期/类加载期/运行期)Spring AOP在运行期通过动态代理织入权限校验

三、Spring AOP的实现原理(核心考点)

Spring AOP基于动态代理实现,分两种场景:

  1. 目标对象有接口:使用JDK动态代理(生成接口的代理类,基于反射);
  2. 目标对象无接口:使用CGLIB动态代理(生成目标类的子类,基于字节码增强)。
极简代码示例

用AOP实现「接口日志记录」,直观展示核心逻辑:

// 1. 定义切面(Aspect)@Aspect@ComponentpublicclassLogAspect{// 2. 定义切点(Pointcut):匹配com.example.service下所有方法@Pointcut("execution(* com.example.service.*.*(..))")publicvoidservicePointcut(){}// 3. 定义通知(Advice):方法执行前记录日志@Before("servicePointcut()")publicvoidbeforeAdvice(JoinPointjoinPoint){// 获取方法名和参数,记录日志StringmethodName=joinPoint.getSignature().getName();Object[]args=joinPoint.getArgs();System.out.println("方法"+methodName+"开始执行,参数:"+Arrays.toString(args));}// 方法执行后记录日志(无论是否异常)@After("servicePointcut()")publicvoidafterAdvice(JoinPointjoinPoint){StringmethodName=joinPoint.getSignature().getName();System.out.println("方法"+methodName+"执行结束");}}

四、AOP的典型应用场景

  1. 日志记录:统一记录接口的入参、出参、执行时间,无需在每个方法写日志代码;
  2. 事务管理:Spring的@Transactional就是基于AOP实现,方法执行前开启事务,执行后提交/回滚;
  3. 权限校验:统一校验接口的用户权限,比如admin接口必须校验token;
  4. 性能监控:统计方法执行耗时,定位慢接口;
  5. 异常处理:统一捕获业务方法的异常,格式化返回结果。

五、Spring AOP vs 原生AOP

补充:

  • Spring AOP是「轻量级AOP实现」,仅支持方法级别的连接点(不能织入到字段、构造方法);
  • AspectJ是「完整的AOP框架」,支持编译期/类加载期织入,功能更强,但配置更复杂;
  • Spring AOP默认整合了AspectJ的注解(如@Aspect),但底层还是动态代理。

总结

  1. AOP核心:抽离通用功能(切面),动态织入业务代码,解决代码冗余,提高可维护性;
  2. Spring实现:基于动态代理(JDK/CGLIB),运行期织入,核心是切面、切点、通知;
  3. 核心价值:分离「业务逻辑」和「通用功能」,符合「单一职责原则」,是Spring核心特性之一。
http://www.jsqmd.com/news/491513/

相关文章:

  • 回归实战2
  • 一次试样失败催生的技术革新:福尔蒂吹瓶专用ACR助剂逆向推演与流变拟合
  • 半监督食物图像分类项目
  • 国内首个,面向中小企业数据资产估值体系:“荟宸信科面向中小企业数据资产估值体系”正式发布(一)
  • iPhone开发 - %1$、%2$的写法
  • 就让我们从react的渲染逻辑出发吧
  • WordPress报错:preg_match() Compilation failed 错误解决方法
  • 【跨端技术ReactNative】JavaScript学习
  • 长亭 Xray Web 漏洞扫描器
  • 行业大咖谈数据资产|中海油如何规划数据资产管理?央企硬核实践拆解
  • 湘潭品牌设计公司权威推荐榜单
  • 零/负电价来了!储能业主如何抓住机遇?
  • 中小企业可用福尔蒂轻量化改性套件:含17种PA6/PBT配比+免费云端模拟
  • es为什么快面试回答
  • 筋膜提升第几天最肿
  • 深入解析HDFS:定义、架构、原理、应用场景及常用命令
  • 5 分钟搭建 Deepseek 私有化 RAG 知识库!支持多模型切换 + 激活验证 + 增量索引
  • 高级技巧-让AI自我迭代
  • 香港Web3区块链安全公司排行榜前三都有哪些公司?
  • openclaw、workbuddy上必装的12个RAG 应用 Skill 技能
  • 带你轻松了解半导体CIM系统之AMHS (二)
  • Android Studio 安装保姆级教程(mac版)
  • 巴菲特的持股策略:为什么长期持有是关键
  • 2026选不停机换单印刷机源头厂家,看这几点错不了,质量好的不停机换单印刷机技术实力与市场典范解析 - 品牌推荐师
  • 团队最佳实践
  • 改性塑料行业‘iOS生态’初现:福尔蒂开放6大基础配方API供下游二次开发
  • Redis性能提升3倍的5个冷门技巧,90%开发者都不知道!
  • 提示工程容灾备份策略中的网络依赖:架构师教你解决带宽+延迟问题
  • SQL Server 学习笔记:从 MySQL 到 SQL Server
  • 如何用NFC标签直接打开应用的某个功能?技术深度解析与商业落地