1.aop���Դ��
2.AOP 相关术语
3.Spring Boot 使用 AOP 防止重复提交
4.Java实现AOP的框p框几种方式
5.为ä»ä¹springä¸AOP ç¨çå¾å°
6.AOP 利器 ——ASM 基础入门
aop���Դ��
在C#中,依赖注入框架是架源架构建可维护和可测试代码的重要工具。以下是框p框六个知名的依赖注入框架,你应该了解它们:
1. ServiceCollection
.NET Core内置的架源架依赖注入容器。
实现方法:通过打开NuGet包管理器,框p框安装Microsoft.Extensions.DependencyInjection包。架源架网站源码加后门
2. Grace
一个开源、框p框轻量级、架源架易于使用的框p框依赖注入容器框架,提供丰富的架源架特性与优秀的性能。
获取资源:在Nuget或Github查找。框p框
使用方法:使用容器对象定位类型。架源架
3. Autofac
一款轻量级且性能高效的框p框依赖注入框架。
官方网站:autofac.org。架源架
源码地址:github.com/autofac/Autofac。框p框
4. Spring.NET
关注于.NET企业应用开发的框架,提供依赖注入、AOP、js 保护源码数据访问抽象与ASP.NET集成等功能。
官方网站:springframework.net。
5. MEF
Managed Extensibility Framework,一个用于创建可扩展的轻型应用程序的库,提供发现与使用扩展的途径。
6. Unity
微软Enterprise Library的一个组件,提供依赖注入模式,用于解耦对象间的依赖。
AOP 相关术语
AOP中,关键术语的解释如下:
连接点(Joinpoint): 在Spring框架中,这些指的是被拦截的对象,特别是方法,因为Spring主要支持的是方法级别的连接点。简单来说,它是目标对象中所有可被拦截的点。
切入点(Pointcut): 定义了我们希望对哪些连接点进行拦截的范围。这个概念帮助我们确定哪些方法需要增强或修改行为。cf源码破解
通知(Advice): 是AOP的核心,拦截到连接点后,通知定义了后续的操作。包括前置通知(在方法执行前执行)、后置通知(在方法执行后执行)、异常通知(处理方法异常)、最终通知(无论方法执行结果如何都会执行)和环绕通知(围绕方法执行的完整流程)。
引介(Introduction): 是一种特殊的通知,它能在不修改类源代码的情况下,为类动态添加方法或字段,提供了一种灵活的扩展方式。
目标对象(Target): 是代理的目标,即原始的对象或被代理的对象,即通知增强的对象。
织入(Weaving): 是将增强应用到目标对象,生成新代理对象的过程。Spring使用动态代理实现织入,词焙 源码而AspectJ则支持编译期和类装载期的织入方式。
代理(Proxy): 一个对象经过AOP的增强后,会生成一个新的代理对象,用于包裹和增强原始对象的行为。
切面(Aspect): 最终,切面是切入点(Pointcut)和通知(Advice)的结合体,它定义了何时何地以及如何执行通知。通过切面,我们能够实现代码的解耦和模块化增强。
Spring Boot 使用 AOP 防止重复提交
在Spring Boot项目中,为了简化防止重复提交的处理,可以利用AOP(面向切面编程)实现。传统的做法是后端生成一个唯一令牌并存储,但这样会增加前后端的协作工作。本文将介绍一种无需前端参与的后端处理方式,即使用Redis分布式锁来确保提交的唯一性。 如果你对Redis分布式锁的北京 赛车源码实现感兴趣,可以参考以下资源:[点击这里了解更多](Redis分布式锁的正确实现方式)。对于单机部署,本地线程安全的Cache(如ConcurrentHashMap)同样适用。 下面给出关键的AOP类和测试代码示例:[访问源码](github.com/TavenYin/tav...) 测试案例中,我们模拟十个线程并发提交,结果显示,尽管所有请求几乎同时发起,但只有一次提交成功,充分展示了防止重复提交的效果。要运行这个测试,只需启动本地Redis,然后运行项目即可。更多详细步骤可以参考:[具体步骤](jianshu.com/p/c6bb6...) 如果你还想深入了解相关知识,可以参考以下链接:Web网站架构的发展历程
Java编程的最佳实践
利用Springboot、Redis和注解实现接口幂等性校验
提升Java代码性能的实用技巧
以上是利用Spring Boot和AOP实现防止重复提交的简要介绍,通过分布式锁机制,简化了开发流程,并确保了提交请求的唯一性。
Java实现AOP的几种方式
(1)AOP的各种实现
在编译器修改源代码、在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码。以下是各种实现机制的比较:
类别分为静态AOP(包括静态织入)和动态AOP(包括动态代理、动态字节码生成、自定义类加载器、字节码转换)。
静态织入:
a、原理:在编译期,切面直接以字节码形式编译到目标字节码文件中 ;
b、优点:对系统性能无影响;
c、缺点:不够灵活;
动态代理 :
a、原理:在运行期,目标类加载后,为接口动态生成代理类。将切面织入到代理类中;
b、优点:更灵活;
c、缺点:切入的关注点要实现接口;
为ä»ä¹springä¸AOP ç¨çå¾å°
spring AOPä¸æ¯ç¨åå°å®ç°çï¼èbeançå建ä¸è¬æ¯è¿æ ·åçã
springé主è¦éè¿Javaå¨æ代çæ¥å£ãcglibçæåç±»ãAspectJè¿ä¸ç§æ¹å¼æ¥å®ç°AOPã
éè¿AOPè¿è¡å£°æå¼äºå¡ç®¡çåºè¯¥æ¯å¤§å®¶ç¨çæå¤çå§ãåæéæ ¡éªåæ¥å¿è®°å½è½ç¶ä¹å ·å¤ä¸å®ç横åæ§éæ±ï¼ä½å¥½åå¾å°æ¿springæ¥åï¼æéæ§å¶æ¡æ¶åæ¯å¯ä»¥èèä¸springè¿è¡éæï¼ç»ç²åº¦çæ¥å¿è®°å½åæ ¹æ¬æ æ³çæ£å©ç¨AOPæ¥åï¼åå å¨äºä¸å¡æ¹æ³è®°å½æ¥å¿çä½ç½®æ¯ä¸ç»ä¸çï¼ä»èæ æ³ç¡®å®åå ¥ç¹ã
ä½springå©ç¨AOPè¿æ¯å¹²äºä¸å°äºæ çï¼é便翻çæºç ä½ é½å¯ä»¥åç°å®ä»¬çå½±åã举个ä¾åï¼springéæä¸ä¸ªjavax.sql.DataSourceç代çç±»TransactionAwareDataSourceProxyï¼å®å©ç¨javaçå¨æ代çå¨è¿è¡æ¶æ¿æ¢äºåçDataSourceçgetConnectionç诸å¤æ¹æ³ï¼æéè¦çæ¯å®ä½¿ä½ çéçç³»ç»å ·å¤äºä¸springéæ并使ç¨springäºå¡ç®¡ççè½åï¼èè¿ä¸åä½ åªéè¦ä¸ä¸ªç®åçé ç½®ï¼ä½ 并ä¸ç¥éspringå¨åå°ä¸ºä½ åäºè¿äºäºæ ã
AOPæ¯ä¸ç§å¾æç¨çç¼ç¨ç念ï¼è¯è¨åå·¥å ·ä¸åºæ为æ们ç¨åºåææ³çæç¼ï¼å³ä½¿é¡¹ç®ä¸ç¨spring AOPä½ ä¹å¯ä»¥å¨éå½çå¥æºæspringé好çæ³æ³æ¿æ¥ç¨ï¼çè³ä½ è§å¾ä¸å¥½è¿å¯ä»¥æ¹é å®ï¼è¿æ ·æ们æè½çæ£æä¸ºå·¥å ·ç主人èä¸æ¯å¥´ä»ã
AOP 利器 ——ASM 基础入门
ASM 是一个 Java 字节码操作框架,用于动态生成类或增强既有类功能。它能直接生成二进制 class 文件,并在类被加载到 Java 虚拟机之前动态改变类行为。ASM 框架提供常见的字节码分析和生成工具,帮助快速进行类生成或分析转换。
在 Android 开发中,Android Gradle 1.5 版本后的 Transform 机制允许第三方插件在 .class 文件打包成 dex 之前进行动态修改,为动态修改字节码文件提供了入口,例如添加埋点、插入日志等。
ASM 在多个出色项目中被广泛使用,包括一个由官方提供的入门电子书(英文版),国内也有汉化版本可供查阅。
ASM 框架结构分为核心 API 和树 API 两大部分。核心 API 包括基于事件和基于对象两种形式的类生成与解析。核心 API 中定义了类访问类的事件序列,而树 API 则以对象树形式表示类,构建在核心 API 之上。
ASM 源码目录结构清晰,大致分为几个关键包:组织字节码处理的核心 API、提供工具和适配器的 commons 包、定义泛型操作的 signature 包、以及基于对象的树 API 相关操作。
核心 API 包括 ClassVisitor、FieldVisitor、MethodVisitor 和 AnnotationVisitor,用于访问 .class 文件中的 fields、methods 和 annotations 相关指令。ClassReader 和 ClassWriter 分别用于加载和生成字节码文件。
TraceClassVisitor 和 CheckClassAdapter 功能强大,前者用于输出字节码指令,后者用于提前检测类的有效性,确保生成的类符合 JVM 验证规则。
MethodVisitor 用于处理方法,允许访问和生成方法。方法执行顺序有严格规定,以确保正确性。LocalVariablesSorter 和 AdaviceAdapter 提供插入局部变量和代码的功能。FieldVisitor 则用于访问和生成字段。
AnnotationVisitor 用于访问注解,SignatureVisitor 用于处理泛型类型签名。树 API 包含 ClassNode、FieldNode 和 MethodNode 等,用于生成和表示类、字段和方法。
ClassNode 生成类对象,FieldNode 生成字段对象,ClassWriter 和 ClassReader 用于与 ClassNode 交互。MethodNode 生成方法对象,InsnList 用于表示指令集合。Tree API 能将事件序列转换为对象树,反之亦然。
ASM 提供了基于树 API 的方法分析模块,支持数据流分析和指令集分析。正向分析和反向分析帮助优化方法执行。Analyzer.getFrames 方法返回计算帧,可用于删除无用代码。
总结,ASM 是 Java 字节码操作的强大工具,适用于动态类生成、增强类功能、修改字节码和分析方法。深入学习可以利用 asm4-guide,推荐的案例开源库可作为学习资源。
springâAOPä¸äºå¡
title: springââAOPä¸äºå¡.mddate: -- ::
categories: [Spring]
tags: [AOP,äºå¡]
toc: true
å ååºæºç ä¸æ¯è¾éç¹çå 个类ï¼
1ã<aop:before method="before" pointcut-ref="myMethods"/>å è£ æä¸ä¸ªadvisor
2ãAspectJAwareAdvisorAutoProxyCreatorï¼å½å®ä¾åææbeané½ä¼æ§è¡å°AspectJAwareAdvisorAutoProxyCreatorç±»
å®ä¼æ£æµbeanæ¯å¦advisor以åadviceåå¨ï¼å¦ææ就说æè¿ä¸ªbeanæåé¢ï¼æåé¢é£ä¹å°±ä¼çæ代ç
3ãjdkç代çï¼beanéé¢çææadvisorå å ¥å°proxyFactoryã
4ãjdkDynamicProxy invokeï¼æ¿å°beanéé¢çææInterceptorï¼ä¼å¾ªç¯proxyFactoryéé¢çææadvisor
éé¢æadviceï¼éé¢çadviceæ两ç§ç±»åï¼è¦ä¹æ¯adviceï¼è¦ä¹æ¯MethodInterceptorç±»åç
5ãå½ä»£ç对象è°ç¨æ¹å¼ï¼æ¯ä¸ä¸ªMethodInterceptorç±»åçç±»çé¾å¼è°ç¨è¿ç¨ï¼ç´å°å®¹å¨ç大å°åç´¢å¼ä¸è´çæ¶åè°ç¨JoinPointç®æ æ¹æ³
beforeï¼this.advice.before(),invocation.processd();
è£ é åæ°ï¼åé¢éé¢beforeæ¹æ³çmethod对象ï¼method.getParamterTypes()[0]
æç»ä¼æadviceå°è£ æMethodInterceptorç±»åç对象
ç¨åºæ§è¡çæ个ç¹å®ä½ç½®ï¼å¦ç±»å¼å§åå§ååãç±»åå§ååãç±»æ个æ¹æ³è°ç¨åãè°ç¨åãæ¹æ³æåºå¼å¸¸åãä¸ä¸ªç±»æä¸æ®µç¨åºä»£ç æ¥æä¸äºå ·æè¾¹çæ§è´¨çç¹å®ç¹ï¼è¿äºç¹ä¸çç¹å®ç¹å°±ç§°ä¸ºâè¿æ¥ç¹âãSpringä» æ¯ææ¹æ³çè¿æ¥ç¹ï¼å³ä» è½å¨æ¹æ³è°ç¨åãæ¹æ³è°ç¨åãæ¹æ³æåºå¼å¸¸æ¶ä»¥åæ¹æ³è°ç¨ååè¿äºç¨åºæ§è¡ç¹ç»å ¥å¢å¼ºãè¿æ¥ç¹ç±ä¸¤ä¸ªä¿¡æ¯ç¡®å®ï¼ç¬¬ä¸æ¯ç¨æ¹æ³è¡¨ç¤ºçç¨åºæ§è¡ç¹ï¼ç¬¬äºæ¯ç¨ç¸å¯¹ç¹è¡¨ç¤ºçæ¹ä½ã
æ¯ä¸ªç¨åºç±»é½æ¥æå¤ä¸ªè¿æ¥ç¹ï¼å¦ä¸ä¸ªæ¥æ两个æ¹æ³çç±»ï¼è¿ä¸¤ä¸ªæ¹æ³é½æ¯è¿æ¥ç¹ï¼å³è¿æ¥ç¹æ¯ç¨åºç±»ä¸å®¢è§åå¨çäºç©ãAOPéè¿âåç¹âå®ä½ç¹å®çè¿æ¥ç¹ãè¿æ¥ç¹ç¸å½äºæ°æ®åºä¸çè®°å½ï¼èåç¹ç¸å½äºæ¥è¯¢æ¡ä»¶ãåç¹åè¿æ¥ç¹ä¸æ¯ä¸å¯¹ä¸çå ³ç³»ï¼ä¸ä¸ªåç¹å¯ä»¥å¹é å¤ä¸ªè¿æ¥ç¹ãå¨Springä¸ï¼åç¹éè¿org.springframework.aop.Pointcutæ¥å£è¿è¡æè¿°ï¼å®ä½¿ç¨ç±»åæ¹æ³ä½ä¸ºè¿æ¥ç¹çæ¥è¯¢æ¡ä»¶ï¼Spring AOPçè§å解æå¼æè´è´£åç¹æ设å®çæ¥è¯¢æ¡ä»¶ï¼æ¾å°å¯¹åºçè¿æ¥ç¹ãå ¶å®ç¡®åå°è¯´ï¼ä¸è½ç§°ä¹ä¸ºæ¥è¯¢è¿æ¥ç¹ï¼å 为è¿æ¥ç¹æ¯æ¹æ³æ§è¡åãæ§è¡åçå æ¬æ¹ä½ä¿¡æ¯çå ·ä½ç¨åºæ§è¡ç¹ï¼èåç¹åªå®ä½å°æ个æ¹æ³ä¸ï¼æ以å¦æå¸æå®ä½å°å ·ä½è¿æ¥ç¹ä¸ï¼è¿éè¦æä¾æ¹ä½ä¿¡æ¯ã
å¢å¼ºæ¯ç»å ¥å°ç®æ ç±»è¿æ¥ç¹ä¸çä¸æ®µç¨åºä»£ç ï¼å¨Springä¸ï¼å¢å¼ºé¤ç¨äºæè¿°ä¸æ®µç¨åºä»£ç å¤ï¼è¿æ¥æå¦ä¸ä¸ªåè¿æ¥ç¹ç¸å ³çä¿¡æ¯ï¼è¿ä¾¿æ¯æ§è¡ç¹çæ¹ä½ãç»åæ§è¡ç¹æ¹ä½ä¿¡æ¯ååç¹ä¿¡æ¯ï¼æ们就å¯ä»¥æ¾å°ç¹å®çè¿æ¥ç¹ã
å¢å¼ºé»è¾çç»å ¥ç®æ ç±»ãå¦æ没æAOPï¼ç®æ ä¸å¡ç±»éè¦èªå·±å®ç°ææé»è¾ï¼èå¨AOPç帮å©ä¸ï¼ç®æ ä¸å¡ç±»åªå®ç°é£äºé横åé»è¾çç¨åºé»è¾ï¼èæ§è½çè§åäºå¡ç®¡ççè¿äºæ¨ªåé»è¾åå¯ä»¥ä½¿ç¨AOPå¨æç»å ¥å°ç¹å®çè¿æ¥ç¹ä¸ã
å¼ä»æ¯ä¸ç§ç¹æ®çå¢å¼ºï¼å®ä¸ºç±»æ·»å ä¸äºå±æ§åæ¹æ³ãè¿æ ·ï¼å³ä½¿ä¸ä¸ªä¸å¡ç±»åæ¬æ²¡æå®ç°æ个æ¥å£ï¼éè¿AOPçå¼ä»åè½ï¼æ们å¯ä»¥å¨æå°ä¸ºè¯¥ä¸å¡ç±»æ·»å æ¥å£çå®ç°é»è¾ï¼è®©ä¸å¡ç±»æ为è¿ä¸ªæ¥å£çå®ç°ç±»ã
ç»å ¥æ¯å°å¢å¼ºæ·»å 对ç®æ ç±»å ·ä½è¿æ¥ç¹ä¸çè¿ç¨ãAOPåä¸å°ç»å¸æºï¼å°ç®æ ç±»ãå¢å¼ºæå¼ä»éè¿AOPè¿å°ç»å¸æºå¤©è¡£æ ç¼å°ç¼ç»å°ä¸èµ·ãæ ¹æ®ä¸åçå®ç°ææ¯ï¼AOPæä¸ç§ç»å ¥çæ¹å¼ï¼
aãç¼è¯æç»å ¥ï¼è¿è¦æ±ä½¿ç¨ç¹æ®çJavaç¼è¯å¨ã
bãç±»è£ è½½æç»å ¥ï¼è¿è¦æ±ä½¿ç¨ç¹æ®çç±»è£ è½½å¨ã
cãå¨æ代çç»å ¥ï¼å¨è¿è¡æ为ç®æ 类添å å¢å¼ºçæåç±»çæ¹å¼ã
Springéç¨å¨æ代çç»å ¥ï¼èAspectJéç¨ç¼è¯æç»å ¥åç±»è£ è½½æç»å ¥ã
ä¸ä¸ªç±»è¢«AOPç»å ¥å¢å¼ºåï¼å°±äº§åºäºä¸ä¸ªç»æç±»ï¼å®æ¯èåäºåç±»åå¢å¼ºé»è¾ç代çç±»ãæ ¹æ®ä¸åç代çæ¹å¼ï¼ä»£çç±»æ¢å¯è½æ¯ååç±»å ·æç¸åæ¥å£çç±»ï¼ä¹å¯è½å°±æ¯åç±»çåç±»ï¼æ以æ们å¯ä»¥éç¨è°ç¨åç±»ç¸åçæ¹å¼è°ç¨ä»£çç±»ã
åé¢ç±åç¹åå¢å¼ºï¼å¼ä»ï¼ç»æï¼å®æ¢å æ¬äºæ¨ªåé»è¾çå®ä¹ï¼ä¹å æ¬äºè¿æ¥ç¹çå®ä¹ï¼Spring AOPå°±æ¯è´è´£å®æ½åé¢çæ¡æ¶ï¼å®å°åé¢æå®ä¹ç横åé»è¾ç»å ¥å°åé¢ææå®çè¿æ¥ç¹ä¸ã
advisorï¼ pointCut advice
ä¸ç±»åè½çå¢å¼º
aroundæ¹æ³éé¢ä»£ç åé¢
äºå¡åé¢
ç¼ååé¢
æ¥å¿åé¢
äºå¡ï¼Transactionï¼ï¼ä¸è¬æ¯æè¦åçææåçäºæ ãå¨è®¡ç®æºæ¯è¯ä¸æ¯æ访é®å¹¶å¯è½æ´æ°æ°æ®åºä¸åç§æ°æ®é¡¹çä¸ä¸ªç¨åºæ§è¡åå (unit)ãæ¯æ°æ®åºæä½çæå°å·¥ä½åå ï¼æ¯ä½ä¸ºå个é»è¾å·¥ä½åå æ§è¡çä¸ç³»åæä½ï¼è¿äºæä½ä½ä¸ºä¸ä¸ªæ´ä½ä¸èµ·åç³»ç»æ交ï¼è¦ä¹é½æ§è¡ãè¦ä¹é½ä¸æ§è¡ï¼äºå¡æ¯ä¸ç»ä¸å¯ååå²çæä½éåï¼å·¥ä½é»è¾åå ï¼ã
大è´æµç¨å½¢å¦
æ°æ®åºäºå¡æ¥æå 大ç¹æ§ï¼
äºå¡çå大ç¹æ§ï¼
äºå¡æ¯æ°æ®åºçé»è¾å·¥ä½åä½ï¼äºå¡ä¸å å«çåæä½è¦ä¹é½åï¼è¦ä¹é½ä¸å
äº å¡æ§è¡çç»æå¿ é¡»æ¯ä½¿æ°æ®åºä»ä¸ä¸ªä¸è´æ§ç¶æåå°å¦ä¸ä¸ªä¸è´æ§ç¶æãå æ¤å½æ°æ®åºåªå å«æåäºå¡æ交çç»ææ¶ï¼å°±è¯´æ°æ®åºå¤äºä¸è´æ§ç¶æãå¦ææ°æ®åºç³»ç» è¿è¡ä¸åçæ éï¼æäºäºå¡å°æªå®æ就被迫ä¸æï¼è¿äºæªå®æäºå¡å¯¹æ°æ®åºæåçä¿®æ¹æä¸é¨åå·²åå ¥ç©çæ°æ®åºï¼è¿æ¶æ°æ®åºå°±å¤äºä¸ç§ä¸æ£ç¡®çç¶æï¼æè è¯´æ¯ ä¸ä¸è´çç¶æã
ä¸ä¸ªäºå¡çæ§è¡ä¸è½å ¶å®äºå¡å¹²æ°ãå³ä¸ä¸ªäºå¡å é¨çæä½å使ç¨çæ°æ®å¯¹å ¶å®å¹¶åäºå¡æ¯é离çï¼å¹¶åæ§è¡çå个äºå¡ä¹é´ä¸è½äºç¸å¹²æ°ã
ä¹ç§°æ°¸ä¹ æ§ï¼æä¸ä¸ªäºå¡ä¸æ¦æ交ï¼å®å¯¹æ°æ®åºä¸çæ°æ®çæ¹åå°±åºè¯¥æ¯æ°¸ä¹ æ§çãæ¥ä¸æ¥çå ¶å®æä½ææ éä¸åºè¯¥å¯¹å ¶æ§è¡ç»ææä»»ä½å½±åã
个人ç解ï¼äºå¡å¨Springä¸æ¯åå©AOPææ¯æ¥å®ç°çï¼å¯ä»¥ä½ä¸ºAOPä¸çä¸ä¸ªäºå¡åé¢ãspringæºç 对äºå¡çå¤çé»è¾ï¼èªå·±ç 究å§ï¼
ORMæ¡æ¶ä¸ä»¥Mybatis为ä¾ï¼äºå¡å¤çå°±æ¯ç¨å°äºä¸ä¸ªç±»Transactionï¼é¨åæºç å¦ä¸
å¯ä»¥çåºTransaction管ççå°±æ¯ä¸ä¸ªconnectionï¼èconnectionæ们å¾æ¸ æ¥æ¯ä¸ç¨æ·ä¼è¯æé©çã
é£ä¹å ³ç³»å°±æ¯Transaction 管çConnection ï¼èconnectionä¸ ç¨æ·sessionä¸å¯¹ä¸åå¨ã
å¨springBootä¸ï¼åªéè¦å å ¥POMå°±å¯ä»¥äºï¼é å注解使ç¨å³å¯ã
æ¥ä¸æ¥å°±æ¯äºå¡çæ§å¶äºã
é¦å äºå¡æå å¤§ä¼ æå±æ§ï¼
å ¶ä¸æ常è§çï¼ç¨å¾æå¤å°± PROPAGATION_REQUIREDãPROPAGATION_REQUIRES_NEWã PROPAGATION_NESTED è¿ä¸ç§ãäºå¡çä¼ æå±æ§æ¯ spring ç¹æçï¼æ¯ spring ç¨æ¥æ§å¶æ¹æ³äºå¡çä¸ç§æ段ï¼è¯´ç´ç½ç¹å°±æ¯ç¨æ¥æ§å¶æ¹æ³æ¯å¦ä½¿ç¨åä¸äºå¡çä¸ç§å±æ§ï¼ä»¥åæç §ä»ä¹è§ååæ»çä¸ç§æ段ã
ä¸é¢ç¨ä»£ç æ¼ç¤ºè¿ä¸ç§å±æ§çæºå¶ï¼
äºå¡çé»è®¤å±æ§å°±æ¯requiredï¼éè¿Transactional.javaä¸çPropagation propagation() default Propagation.REQUIRED; å¯ä»¥çåºã
è¿ç§æ åµå°±æ¯äºå¡1ï¼äºå¡2 é½å å ¥å°äºäºå¡0ä¸ãä¸ç®¡æ¯1ï¼2åªä¸ªäºå¡æåºå¼å¸¸ï¼äºå¡0é½ä¼åæ»ãæ°æ®æ·»å ä¼å¤±è´¥ã
è¿ç§æ åµå°±æ¯ï¼
äºå¡0ï¼requiredï¼ {
äºå¡1 ï¼REQUIRES_NEWï¼
äºå¡2
}
æ¤æ¶ã
æ åµaï¼
1ãå¦æåªæ¯äºå¡2åºç°äºå¼å¸¸ï¼é£ä¹äºå¡1ä¼æ交ï¼äºå¡2å å ¥å°äºå¡0ä¸ä¼åæ»ã
2ãå¦æåªæ¯äºå¡1åºç°äºå¼å¸¸ï¼é£ä¹äºå¡1ä¼åæ»ï¼åä¸å±äºå¡0æå¼å¸¸ï¼äºå¡2ä¼å å ¥å°äºå¡0ä¸ï¼è¿æ¶é½ä¼åæ»ã
æ åµbï¼
å¦æäºå¡1ï¼äºå¡2é½æ¯REQUIRES_NEWä¼ æå±æ§ãé£ä¹ç»æå°±æ¯ï¼
1ãå¦æäºå¡1ï¼æåºäºå¼å¸¸ï¼é£ä¹äºå¡2æ¯ä¸ä¼æ§è¡çï¼é£ä¹äºå¡0å¿ ç¶åæ»ã
2ãå¦æäºå¡2ï¼æåºå¼å¸¸ï¼é£ä¹äºå¡1ä¼æ交ï¼è¡¨ä¸ä¼ææ°æ®ãäºå¡2æå¼å¸¸åæ»å¹¶æåºï¼äºå¡0åæ»ã
NESTEDå±æ§å ¶å®å°±æ¯å建äºåæ»ç¹ï¼æå¼å¸¸æ¶ï¼ä¼åæ»å°æå®çåæ»ç¹ã
å¨è¿éè¿ä»£ç æµè¯ï¼åºç°ä¸ç§æ åµæ¯ï¼æ 论äºå¡1ï¼äºå¡2åªä¸ªæå¼å¸¸ï¼æ°æ®é½ä¸ä¼æå ¥æåï¼åå æ¯ï¼ä¸è®ºæ¯äºå¡1è¿æ¯äºå¡2é½ä¼åäºå¡0æåºå¼å¸¸ï¼äºå¡0æè·å°å¼å¸¸åï¼æ§è¡rollback()æ¹æ³ï¼è¿å°±æä½æäºï¼äºå¡çå ¨é¨åæ»ã
å¦ææ³è¦äºå¡1åäºå¡2 æ³è¦æ ¹æ®èªå·±çåæ»ç¹åæ»ï¼é£ä¹äºå¡0å¿ é¡»èªå·±å¤çå¼å¸¸ï¼ä¸è®©springæè·å°è¿ä¸ªå¼å¸¸ï¼é£ä¹å°±æ»¡è¶³äºãæ代ç æ¹æè¿ç§ï¼
Jack大佬æä¾äºï¼ä¼ªä»£ç åææ³ã
æç §Springæºç çäºå¡å¤çé»è¾ï¼ä¼ªä»£ç 大è´ä¸ºï¼