尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
一文讲透 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 事务注解。
RELATED

相关推荐

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

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

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

📅 2026/9/10 5:58:19
Linux命令高效学习心法:从场景驱动到组合实战

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

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

📅 2026/9/17 9:35:12
AI辅助逆向工程实战:基于Skill与MCP协议构建智能分析工作流

AI辅助逆向工程实战:基于Skill与MCP协议构建智能分析工作流

这次我们来看一个将 AI 大模型能力与传统逆向工程结合的实战项目。标题“无AI不逆向”点明了核心:利用 AI 辅助工具,特别是Skill和MCP (Model Context Protocol),来提升逆向分析,尤其是像抖音参数逆向这类复杂任务的效率和深度。这…

📅 2026/9/9 2:06:43
MORE NEWS

更多资讯

📰

智能监控网关:多协议转换与统一接入实战指南

1. 机房与工业现场的设备接入困境干过机房运维或者工业自动化现场的朋友,大概率都遇到过这种局面:机柜里躺着七八个品牌的设备,电表走Modbus RTU,空调走SNMP,PLC走Modbus TCP,门禁控制器又是私有RS485协议&…

📰

工程科研AI协作实战:命令行代理与项目说明文件配置指南

1. 工程科研场景下AI工具选型的底层逻辑 1.1 为什么通用聊天窗口撑不起真正的科研工作流 我最早接触AI辅助科研,和大多数人一样,是从网页版对话窗口开始的。查文献、润色摘要、解释一段公式,确实方便。但用了不到两周就发现一个致命问题&…

📰

国产AI突围:MoE架构如何省算力降能耗,落地全工业场景

1. 国产AI突围的底层逻辑:为什么能源和架构成了胜负手过去两年,我一直在跟踪国内大模型从实验室走向产线的全过程。说实话,最初大家比拼的是参数规模,谁的模型大谁就有话语权。但到了2024年下半年,风向明显变了——能源…

📰

Obsidian+WorkBuddy+Gitee:打造AI驱动的本地知识库与多端同步方案

1. 为什么我要折腾这套组合 先说结论:我用 Obsidian WorkBuddy Gitee 这套组合,把自己的知识库从"一堆散落的 Markdown 文件"变成了一个能自动整理、自动打标签、自动同步、还能被 AI 随时调用的第二大脑。整个过程踩了不少坑,…

📰

打工人必备的劳动法操作系统:CLI思维与证据工程

1. 这不是普法课,是打工人每天都在用的“操作系统补丁”“建议所有打工人把这个劳动法 Skill 装进电脑里”——这句话刚刷到时,我正盯着屏幕上第7份没签回执的加班确认单发呆。不是不想维权,是根本不知道从哪调用“法律接口”。我们写代码要查…

📰

安卓玩转Unity重制版头文字D3:800×600分辨率调优实战

不知道有没有人跟我一样,小时候在游戏厅里看别人打头文字D系列街机,那种方向盘回馈和山路漂移的爽快感,一直记到现在。这几年安卓性能提升非常明显,尤其是旗舰机普遍用上了骁龙八系列芯片之后,不少玩家开始尝试在手机上…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬