一文讲透 Spring AOP、Bean 作用域与事务:从代理机制到事务失效
Spring AOP、Bean 作用域和事务看似是三个知识点实际上都与 Spring 容器和代理机制密切相关容器管理 Bean 的生命周期AOP 为 Bean 创建代理声明式事务则是 AOP 的典型应用。一、Spring AOP 是什么AOP即面向切面编程用于抽取日志、权限、事务、监控等分散在多个业务类中的横切逻辑使业务方法只关注自身功能。Spring AOP 的核心概念如下连接点Join Point程序执行过程中可以被增强的位置。在 Spring AOP 中主要表示方法执行。切点Pointcut用于筛选连接点决定哪些方法需要增强。通知Advice切点命中后要执行的动作包括Before、After、AfterReturning、AfterThrowing和Around。切面Aspect切点与通知的组合表示“在哪里执行什么增强逻辑”。目标对象Target真正执行业务逻辑的对象。代理对象ProxySpring 创建的包装对象负责在调用目标方法前后执行通知。下面是一个简单的日志切面Aspect Component public class LogAspect { Pointcut(execution(* com.example.service..*(..))) public void serviceMethods() {} Around(serviceMethods()) public Object record(ProceedingJoinPoint joinPoint) throws Throwable { long start System.currentTimeMillis(); try { return joinPoint.proceed(); } finally { System.out.println(耗时 (System.currentTimeMillis() - start)); } } }execution表达式是切点表示匹配service包及其子包中的所有方法Around是环绕通知两者共同组成切面。二、Spring AOP 的具体实现Spring 容器创建 Bean 时自动代理创建器会判断该 Bean 的方法是否被切点匹配。若需要增强Spring 不直接返回原对象而是返回代理对象。调用过程可以简化为调用代理对象 → 匹配切点 → 执行通知链 → 调用目标方法 → 执行后续通知 → 返回结果目标类实现接口时Spring Framework 通常可以使用 JDK 动态代理没有接口时使用 CGLIB 创建目标类的子类也可以通过配置强制使用 CGLIB。由于 CGLIB 依赖继承和方法重写final类、final方法和private方法不能按普通方式被增强。Spring AOP 属于运行时代理只能拦截经过代理对象的方法调用。理解这一点是理解事务自调用失效的关键。三、Spring Bean 的作用域Spring 常用 Bean 作用域包括作用域含义singleton默认值一个容器中同一 Bean 定义共享一个实例prototype每次向容器请求时创建新实例request每个 HTTP 请求一个实例session每个 HTTP Session 一个实例application每个ServletContext一个实例websocket每个 WebSocket 会话一个实例singleton只保证容器内共享同一实例并不保证线程安全。无共享可变状态的 Service 通常可以安全地使用单例如果单例 Bean 保存会被多个线程修改的成员变量就可能产生数据竞争。四、prototype 是否为了解决线程安全prototype每次从容器获取时都会创建新对象适合保存独立状态的 Bean。不同线程如果各自获得不同实例共享状态确实会减少因此它可以用于部分有状态场景。但不能简单地说“prototype 就是为了解决 singleton 线程不安全而出现的”原因有三点它解决的是实例创建和状态隔离问题不保证 Bean 内部使用的数据库、静态变量等共享资源安全Spring 创建 prototype Bean 后通常不再负责其完整销毁流程prototype Bean 直接注入 singleton Bean 时依赖通常只在单例创建时解析一次之后可能一直使用同一个 prototype 实例。如果单例每次调用都需要新的 prototype 实例应使用ObjectProvider、方法注入或作用域代理。更推荐的设计仍是让 Service 保持无状态将请求数据放在参数和局部变量中必要时再使用原子类、并发容器或锁。五、Spring 事务与 ACIDSpring 通过PlatformTransactionManager统一抽象 JDBC、JPA 等事务技术并提供编程式事务和声明式事务。实际开发最常见的是使用Transactional的声明式事务。数据库事务具有 ACID 特性原子性Atomicity事务中的操作全部成功或全部回滚一致性Consistency事务执行前后数据满足业务约束隔离性Isolation并发事务之间相互隔离持久性Durability事务提交后结果能够持久保存。Spring 本身不是数据库不直接实现 ACID。它负责划定事务边界、选择事务管理器并调用提交或回滚真正的 ACID 主要由数据库事务机制保障。Transactional的底层也是 AOP。外部调用事务代理时事务拦截器先开启或加入事务再执行目标方法方法正常结束就提交出现符合规则的异常则回滚。默认情况下未捕获的RuntimeException和Error会触发回滚受检异常默认不会。六、A 调用 BB 的事务会生效吗假设同一个类中存在两个方法Service public class OrderService { public void methodA() { methodB(); } Transactional public void methodB() { // 数据库操作 } }在 Spring 默认代理模式下外部调用代理对象的methodA()代理发现 A 没有事务注解于是直接调用目标对象。A 内部调用 B本质是this.methodB();这次调用发生在目标对象内部没有重新经过 Spring 代理所以 B 上的Transactional通常不会生效。这就是事务的自调用失效。需要注意如果 A 本身已经开启事务并采用默认的REQUIRED传播行为B 中的数据库操作仍会运行在 A 已有的事务里但这不是 B 的注解通过自调用生效而是外层事务本来就存在。七、如何解决事务自调用常见方案有三种拆分类职责把 B 移到另一个 Spring Bean由 A 注入并调用它。这是最清晰、最推荐的方式。通过代理调用注入自身代理或从容器获取代理后调用但会增加代码与容器的耦合应谨慎使用。使用 AspectJ 模式通过编译期或加载期织入直接修改字节码不依赖代理调用因此能处理自调用但配置更复杂。也可以将Transactional放到由外部调用的 A 上让 A 统一作为事务边界但要确认这符合业务原子性和传播要求。八、总结Spring AOP 通过切点选中方法通过通知定义增强逻辑并以 JDK 动态代理或 CGLIB 创建代理对象。Bean 作用域决定实例的创建和共享范围prototype适合有状态对象但不能代替正确的并发设计。Spring 声明式事务是 AOP 的典型应用数据库负责 ACIDSpring 负责事务边界和提交回滚。参考资料Spring AOP 概念、Spring Bean 作用域、Spring 事务注解。

相关新闻

MHY_Scanner 扫码登录器实战指南:从屏幕监控到直播抢码的自动化方案

MHY_Scanner 扫码登录器实战指南:从屏幕监控到直播抢码的自动化方案

MHY_Scanner 扫码登录器实战指南:从屏幕监控到直播抢码的自动化方案 【免费下载链接】MHY_Scanner MHY扫码登录器,支持从直播流抢码。 项目地址: https://gitcode.com/gh_mirrors/mh/MHY_Scanner 凌晨两点,某直播间内一个限时限量的兑…

2026/9/29 4:11:20 阅读更多 →
Linux命令高效学习心法:从场景驱动到组合实战

Linux命令高效学习心法:从场景驱动到组合实战

1. 从“背命令”到“用命令”:一个Linux老兵的视角每次看到“Linux命令大全”这样的标题,我都能回想起自己刚入行时,抱着一本厚厚的命令手册,试图把ls、grep、awk的参数从头背到尾的日子。那种感觉,就像背一本没有目录…

2026/10/11 8:14:57 阅读更多 →
镧:从“隐士“到现代科技的幕后支柱

镧:从“隐士“到现代科技的幕后支柱

镧的名字源自古希腊语"lanthanein",意为"隐藏"。这个命名恰如其分——当科学家最初发现它时,它总是与其他稀土元素纠缠共生,极难分离,仿佛一位深藏不露的隐士。直到1839年,瑞典化学家莫桑德尔才从…

2026/10/10 19:02:34 阅读更多 →

最新新闻

YOLOv10【第十一章:生成式 AI 与自动标注篇·第1节】生成式 AI 如何赋能 YOLOv10:数据、标签、推理三条路线

YOLOv10【第十一章:生成式 AI 与自动标注篇·第1节】生成式 AI 如何赋能 YOLOv10:数据、标签、推理三条路线

🏆 本文收录于 《YOLOv10实战:从入门到深度优化》 专栏。 该专栏系统复现并深度梳理全网主流 YOLOv10 改进方法与工程实战案例,覆盖分类、目标检测、实例分割、多目标追踪、关键点检测、旋转目标检测等多个方向,坚持 持续更新 + 深度解析 + 工程验证。 专栏将围绕 YOLOv10…

2026/10/15 21:21:31 阅读更多 →
小尺寸宿舍屏推荐:24 英寸高刷屏为何成了宿舍刚需

小尺寸宿舍屏推荐:24 英寸高刷屏为何成了宿舍刚需

近两年宿舍桌面的变化很明显。一方面,越来越多学生在有限的空间里搭起了完整的主机加外设桌面;另一方面,游戏本性能不断上探,屏幕反倒成了整套配置里最容易被将就的一环。笔记本自带屏幕处理文档尚可,一旦进入 FPS 或 …

2026/10/15 21:21:31 阅读更多 →
2020软件工程试卷解析:题型分布、答题技巧与避坑指南

2020软件工程试卷解析:题型分布、答题技巧与避坑指南

简介:合肥工业大学2020年软件工程试卷(A卷)是计算机与信息学院软件工程课程的期末真题,适合计算机专业学生、考研复习者及软件工程自学者用于考前自测与考点梳理。资源压缩包共1个docx文档,大小仅25KB,内容…

2026/10/15 21:21:31 阅读更多 →
10 分钟上手 BeefTV:从安装到生成第一个 AI 视频的完整指南

10 分钟上手 BeefTV:从安装到生成第一个 AI 视频的完整指南

人工智能AI 应用AI Agent媒体生成音视频桌面应用 【免费下载链接】BeefTV High-performance Lightweight AI Native Video workspace. 面向 AI 时代的视频创作工作台。 在画布中,和Agent一起自由连接创意、模型与素材。 项目地址: https://gitcode.com…

2026/10/15 21:21:30 阅读更多 →
无犯罪证明NAATI翻译去哪办?有效期多久?移民速看

无犯罪证明NAATI翻译去哪办?有效期多久?移民速看

技术移民、打工度假、留学签证常被要求提供无犯罪记录证明的英文译本,这份材料有个特殊点:底层文件本身有时效,通常要求出具后3—12个月内的版本,翻译环节拖久了,证明可能先过期。无犯罪证明NAATI认证翻译可在线办理&a…

2026/10/15 21:20:30 阅读更多 →
YOLOv10【第十一章:生成式 AI 与自动标注篇·第4节】YOLO-World 开放词汇检测与 YOLOv10 数据冷启动

YOLOv10【第十一章:生成式 AI 与自动标注篇·第4节】YOLO-World 开放词汇检测与 YOLOv10 数据冷启动

🏆 本文收录于 《YOLOv10实战:从入门到深度优化》 专栏。 该专栏系统复现并深度梳理全网主流 YOLOv10 改进方法与工程实战案例,覆盖分类、目标检测、实例分割、多目标追踪、关键点检测、旋转目标检测等多个方向,坚持 持续更新 + 深度解析 + 工程验证。 专栏将围绕 YOLOv10…

2026/10/15 21:20:30 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →