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

Spring知识梳理(4)

Spring知识梳理(4)

作者:没有四次元口袋的蓝胖
日期:2026-07-16
标签:Java, Spring, AOP, 面向切面编程


一、AOP 是什么

AOP(Aspect-Oriented Programming,面向切面编程)是对 OOP 的补充。

  • OOP:纵向继承,解决类与类之间的复用(封装、继承、多态)
  • AOP:横向抽取,解决跨多个类的公共行为复用(日志、事务、权限、性能监控)
传统 OOP 的问题: UserService OrderService ProductService ↓ ↓ ↓ 日志代码 日志代码 日志代码 ← 重复! 事务代码 事务代码 事务代码 ← 重复! 权限代码 权限代码 权限代码 ← 重复! AOP 的解决方式: UserService OrderService ProductService ↓ ↓ ↓ ┌─────────┐ │ AOP 切面 │ ← 统一抽取,一处维护 └─────────┘

一句话总结:AOP 把散落在各处的公共逻辑抽到一个地方统一管理,不侵入业务代码。


二、核心术语(7 个必须分清)

术语英文含义例子
切面Aspect横切关注点的模块化日志切面、事务切面
连接点JoinPoint程序执行的某个点(方法调用、异常抛出)每个方法都是一个连接点
切入点Pointcut你选择的哪些连接点要被增强execution(* service.*.*(..))
通知(增强)Advice切入后做什么打日志、开事务
目标对象Target被代理的原始对象UserService 实例
代理对象ProxyAOP 生成的增强后的对象包含日志逻辑的 UserService
织入Weaving把切面逻辑应用到目标对象的过程Spring 在运行时通过代理完成

面试口诀:切面 = 切入点 + 通知。切入点决定"在哪里切入",通知决定"切入后做什么"。

连接点 vs 切入点(最容易混淆)

  • 连接点:程序中所有可以被拦截的点(所有方法),是客观存在的
  • 切入点:你实际选中的那些连接点,是主观选择的
所有方法 = 连接点(全集) 你选中的方法 = 切入点(子集)

三、五种通知类型

通知注解执行时机用途
前置通知@Before目标方法执行前参数校验、权限检查
后置通知@AfterReturning目标方法正常返回后日志记录
环绕通知@Around包裹目标方法执行事务管理、性能监控
异常通知@AfterThrowing目标方法抛出异常后异常处理、告警
最终通知@After目标方法执行后(无论是否异常)资源清理(类似 finally)

执行顺序

正常执行流程: @Around 前半 → @Before → 目标方法 → @Around 后半 → @AfterReturning → @After 异常执行流程: @Around 前半 → @Before → 目标方法(抛异常)→ @AfterThrowing → @After

注意@After类似于finally,无论正常返回还是异常都会执行。@AfterReturning只在正常返回时执行。

@Around 为什么最强大?

@Around("pointcut()")publicObjectaround(ProceedingJoinPointpjp)throwsThrowable{// 前置逻辑longstart=System.currentTimeMillis();// 可以决定是否执行目标方法(调不调 proceed())Objectresult=pjp.proceed();// 不调用则目标方法不执行// 后置逻辑longcost=System.currentTimeMillis()-start;System.out.println("耗时: "+cost+"ms");// 甚至可以修改返回值returnresult;}

@Around能做的事:

  • ✅ 控制目标方法是否执行(不调proceed()就行)
  • ✅ 修改入参
  • ✅ 修改返回值
  • ✅ 捕获异常不让它传播

其他四种通知做不到这些。


四、Spring AOP 完整执行流程

客户端调用 proxy.method() ↓ 代理对象拦截方法调用 ↓ 根据 Pointcut 匹配:这个方法需要被增强吗? ├── 是 → 按通知类型执行增强逻辑 │ ├── @Before │ ├── 目标方法 │ ├── @AfterReturning / @AfterThrowing │ └── @After └── 否 → 直接调用目标对象的方法

五、思维导图速览

Spring AOP ├── 核心思想 │ ├── 横向抽取公共逻辑(日志、事务、权限) │ ├── 不修改源代码,运行时织入 │ └── 底层 = 动态代理(下篇详解) │ ├── 7 个核心术语 │ ├── Aspect(切面)= Pointcut + Advice │ ├── JoinPoint(连接点)= 所有可拦截的点 │ ├── Pointcut(切入点)= 你选中的连接点 │ ├── Advice(通知)= 切入后做什么 │ ├── Target / Proxy / Weaving │ └── 关键区分:连接点(全集)vs 切入点(子集) │ ├── 五种通知 │ ├── @Before(前置) │ ├── @AfterReturning(后置) │ ├── @Around(环绕)← 最强大,控制执行流 │ ├── @AfterThrowing(异常) │ └── @After(最终,类似 finally) │ └── 执行顺序 ├── 正常:Around前 → Before → 方法 → Around后 → AfterReturning → After └── 异常:Around前 → Before → 方法抛异常 → AfterThrowing → After

六、写在最后

面试回答模板

“AOP 是面向切面编程,把散落在各处的公共逻辑统一抽取管理。核心概念有 7 个,最重要的是切面 = 切入点 + 通知。切入点决定在哪里切入,通知决定切入后做什么。通知有五种,@Around 最强大,可以控制目标方法是否执行、修改入参和返回值。AOP 底层通过动态代理实现,运行时生成代理对象。”

学习建议

  1. 7 个术语:重点区分"连接点 vs 切入点",面试常考
  2. 五种通知:记住执行顺序,理解 @Around 为什么最强
http://www.cnnetsun.cn/news/3492346.html

相关文章:

  • 转向软硬件交界处的微光:我的 Triton 踩坑与蜕变之旅
  • ncmdump终极指南:3步解锁网易云音乐NCM加密格式,实现音乐自由
  • 2026证件照换底色详细操作方法:手机、网页、电脑PS全场景教程
  • Codex+DeepSeek FDE落地案例分享:从模型内卷到落地为王:FDE 为什么突然火了?
  • Flutter第六节-----Flutter部分基础组件解析到自定义组件
  • 360AI搜索响应延迟超2.3s?性能压测报告首曝:3种Query优化策略实测QPS提升417%
  • 深入解析TI MibSPI控制寄存器:ECC诊断与中断配置实战指南
  • 怎样快速搞定Windows苹果驱动:3步精简安装终极指南
  • coding-ethos 实战:把 AI 编码规则变成可回读的 policy 与 remediation
  • 成年人的顶级能力:允许自己搞砸
  • Python TDD实战:红绿重构循环驱动高质量代码开发
  • CyberChef:网络安全分析师的终极数据处理神器
  • C++轻量级状态机TinyFSM:从原理到实战,告别if-else混乱
  • 70V高耐压USB过压保护芯片PW1600——欧盟Type-C 42V认证首选方案
  • 2026 AI副业爆发倒计时:3类零代码技能+2个合规变现闭环,90%程序员尚未察觉
  • C++异步线程池:从原理到工业级实现
  • 从零实现C++ STL set:深入理解红黑树与迭代器封装
  • Linux C读写锁原理与实战:从pthread_rwlock_t到高并发缓存优化
  • C++与OpenCV实现车牌定位:边缘与颜色融合的实战指南
  • C++实现数值求根:从平分法原理到工程实践详解
  • VC++ 2010 Express实战指南:从环境搭建到MFC图形界面开发
  • C++实现LZW压缩算法:从原理到工程实践详解
  • C++并发编程实战:锁机制详解与性能优化指南
  • 基于MediaPipe手势识别实现体感切水果游戏:Python+OpenCV实战
  • 185、注意力机制进化:SAN的二阶通道注意力与RCAN的残差通道注意力对比
  • Meta-Harness: End-to-End Optimization of Model Harnesses——模型工具链的端到端优化
  • OpenClaw 对接 DeepSeek 大模型完整配置实操步骤
  • DMS:用动态麦克劳林级数破解VLA端侧实时性-稳定性-精准性三角
  • Cursor + TDD双引擎启动:从需求描述到可运行测试用例,8分钟极速闭环(含真实电商订单案例)
  • VLA+RL:具身智能从端到端视觉语言动作建模到真实机器人落地