尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Spring知识梳理(4)

Spring知识梳理(4)
📅 发布时间:2026/7/18 16:24:00

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 为什么最强

相关新闻

  • 学嵌入式只选北京这7家培训机构 - 教育品牌推荐官
  • JetBrains IDE试用重置终极指南:简单快速延长30天免费使用期
  • 3分钟开启你的媒体下载革命:Parabolic如何让视频音频下载变得如此简单

最新新闻

  • 彻底解决vscode用不了codex面板问题
  • 基于Python的员工管理系统开题报告
  • UI-TARS 源码解析 #8:桌面端与移动端 Prompt 差异:为什么 mobile 要支持 open_app、press_home、press_back?
  • Makefile精读 · M01-02 | make 如何找到并执行 Makefile:`-f` `-C` 与默认文件名
  • 弱网测试方案:衰减器如何模拟真实环境的信号衰减?
  • 2026年实测靠谱个体户店铺手续代办机构TOP5推荐

日新闻

  • 宝珀中国官方售后服务中心|官方热线和维修地址权威信息声明(2026年7月更新) - 宝珀官方售后服务中心
  • # 2026年北京知识产权律师推荐怎么选?看这五点关键不踩雷 - 本地品牌推荐
  • 2026实测教程:生成的拼豆图纸不满意怎么修改才省事 - 省事研究所

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号