国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

spring中聲明式事務實現原理猜想

Android編程精選 ? 來源:CSDN博客 ? 作者:一擼向北 ? 2021-10-13 09:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

@Transactional注解簡介

@Transactional是spring中聲明式事務管理的注解配置方式,相信這個注解的作用大家都很清楚。@Transactional注解可以幫助我們把事務開啟、提交或者回滾的操作,通過aop的方式進行管理。

通過@Transactional注解就能讓spring為我們管理事務,免去了重復的事務管理邏輯,減少對業務代碼的侵入,使我們開發人員能夠專注于業務層面開發。

我們知道實現@Transactional原理是基于spring aop,aop又是動態代理模式的實現,通過對源碼的閱讀,總結出下面的步驟來了解實際中,在spring 是如何利用aop來實現@Transactional的功能的。

spring中聲明式事務實現原理猜想

首先,對于spring中aop實現原理有了解的話,應該知道想要對一個方法進行代理的話,肯定需要定義切點。在@Transactional的實現中,同樣如此,spring為我們定義了以 @Transactional 注解為植入點的切點,這樣才能知道@Transactional注解標注的方法需要被代理。

有了切面定義之后,在spring的bean的初始化過程中,就需要對實例化的bean進行代理,并且生成代理對象。

生成代理對象的代理邏輯中,進行方法調用時,需要先獲取切面邏輯,@Transactional注解的切面邏輯類似于@Around,在spring中是實現一種類似代理邏輯。

@Transactional作用

根據上面的原理猜想,下面簡單介紹每個步驟的源碼以進行驗證。

首先是@Transactional,作用是定義代理植入點。我們知道代理對象創建的通過BeanPostProcessor的實現類AnnotationAwareAspectJAutoProxyCreatorpostProcessAfterInstantiation方法來實現個,如果需要進行代理,那么在這個方法就會返回一個代理對象給容器,同時判斷植入點也是在這個方法中。

那么下面開始分析,在配置好注解驅動方式的事務管理之后,spring會在ioc容器創建一個BeanFactoryTransactionAttributeSourceAdvisor實例,這個實例可以看作是一個切點,在判斷一個bean在初始化過程中是否需要創建代理對象,都需要驗證一次BeanFactoryTransactionAttributeSourceAdvisor是否是適用這個bean的切點。如果是,就需要創建代理對象,并且把BeanFactoryTransactionAttributeSourceAdvisor實例注入到代理對象中。

前文我們知道在AopUtils#findAdvisorsThatCanApply中判斷切面是否適用當前bean,可以在這個地方斷點分析調用堆棧,AopUtils#findAdvisorsThatCanApply一致調用,最終通過以下代碼判斷是否適用切點。

  • AbstractFallbackTransactionAttributeSource#computeTransactionAttribute(Method method, Class targetClass)這里可以根據參數打上條件斷點進行調試分析調用棧,targetClass就是目標class …一系列調用
  • 最終SpringTransactionAnnotationParser#parseTransactionAnnotation(java.lang.reflect.AnnotatedElement)
@Override
publicTransactionAttributeparseTransactionAnnotation(AnnotatedElementae){
//這里就是分析Method是否被@Transactional注解標注,有的話,不用說BeanFactoryTransactionAttributeSourceAdvisor適配當前bean,進行代理,并且注入切點
//BeanFactoryTransactionAttributeSourceAdvisor
AnnotationAttributesattributes=AnnotatedElementUtils.getMergedAnnotationAttributes(ae,Transactional.class);
if(attributes!=null){
returnparseTransactionAnnotation(attributes);
}
else{
returnnull;
}
}

上面就是判斷是否需要根據@Transactional進行代理對象創建的判斷過程。@Transactional的作用一個就是標識方法需要被代理,一個就是攜帶事務管理需要的一些屬性信息。

動態代理邏輯實現

【aop實現原理分析】中知道,aop最終的代理對象的代理方法是

  • DynamicAdvisedInterceptor#intercept

所以我們可以在這個方法斷點分析代理邏輯。往期的面試題,點擊查看

@Override
publicObjectintercept(Objectproxy,Methodmethod,Object[]args,MethodProxymethodProxy)throwsThrowable{
ObjectoldProxy=null;
booleansetProxyContext=false;
ClasstargetClass=null;
Objecttarget=null;
try{
if(this.advised.exposeProxy){
//Makeinvocationavailableifnecessary.
oldProxy=AopContext.setCurrentProxy(proxy);
setProxyContext=true;
}
//Maybenull.Getaslateaspossibletominimizethetimewe
//"own"thetarget,incaseitcomesfromapool...
target=getTarget();
if(target!=null){
targetClass=target.getClass();
}
//follow
Listchain=this.advised.getInterceptorsAndDynamicInterceptionAdvice(method,targetClass);
ObjectretVal;
//CheckwhetherweonlyhaveoneInvokerInterceptor:thatis,
//norealadvice,butjustreflectiveinvocationofthetarget.
if(chain.isEmpty()&&Modifier.isPublic(method.getModifiers())){
//WecanskipcreatingaMethodInvocation:justinvokethetargetdirectly.
//NotethatthefinalinvokermustbeanInvokerInterceptor,soweknow
//itdoesnothingbutareflectiveoperationonthetarget,andnohot
//swappingorfancyproxying.
Object[]argsToUse=AopProxyUtils.adaptArgumentsIfNecessary(method,args);
retVal=methodProxy.invoke(target,argsToUse);
}
else{
//Weneedtocreateamethodinvocation...
retVal=newCglibMethodInvocation(proxy,target,method,args,targetClass,chain,methodProxy).proceed();
}
retVal=processReturnType(proxy,target,method,retVal);
returnretVal;
}
finally{
if(target!=null){
releaseTarget(target);
}
if(setProxyContext){
//Restoreoldproxy.
AopContext.setCurrentProxy(oldProxy);
}
}
}

		

通過分析List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass)返回的是TransactionInterceptor,利用TransactionInterceptor是如何實現代理邏輯調用的?

跟蹤new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();

發現最終是調用TransactionInterceptor#invoke方法,并且把CglibMethodInvocation注入到invoke方法中,從上面可以看到CglibMethodInvocation是包裝了目標對象的方法調用的所有必須信息,因此,在TransactionInterceptor#invoke里面也是可以調用目標方法的,并且還可以實現類似@Around的邏輯,在目標方法調用前后繼續注入一些其他邏輯,比如事務管理邏輯。

TransactionInterceptor–最終事務管理者

下面看代碼。

  • TransactionInterceptor#invoke
@Override
publicObjectinvoke(finalMethodInvocationinvocation)throwsThrowable{
//Workoutthetargetclass:maybe{@codenull}.
//TheTransactionAttributeSourceshouldbepassedthetargetclass
//aswellasthemethod,whichmaybefromaninterface.
ClasstargetClass=(invocation.getThis()!=null?AopUtils.getTargetClass(invocation.getThis()):null);

//AdapttoTransactionAspectSupport'sinvokeWithinTransaction...
returninvokeWithinTransaction(invocation.getMethod(),targetClass,newInvocationCallback(){
@Override
publicObjectproceedWithInvocation()throwsThrowable{
returninvocation.proceed();
}
});
}

繼續跟蹤invokeWithinTransaction,下面的代碼中其實就可以看出一些邏輯端倪,就是我們猜想的實現方式,事務管理。

protectedObjectinvokeWithinTransaction(Methodmethod,ClasstargetClass,finalInvocationCallbackinvocation)
throwsThrowable{

//Ifthetransactionattributeisnull,themethodisnon-transactional.
finalTransactionAttributetxAttr=getTransactionAttributeSource().getTransactionAttribute(method,targetClass);
finalPlatformTransactionManagertm=determineTransactionManager(txAttr);
finalStringjoinpointIdentification=methodIdentification(method,targetClass);

if(txAttr==null||!(tminstanceofCallbackPreferringPlatformTransactionManager)){
//StandardtransactiondemarcationwithgetTransactionandcommit/rollbackcalls.
//開啟事務
TransactionInfotxInfo=createTransactionIfNecessary(tm,txAttr,joinpointIdentification);
ObjectretVal=null;
try{
//Thisisanaroundadvice:Invokethenextinterceptorinthechain.
//Thiswillnormallyresultinatargetobjectbeinginvoked.
//方法調用
retVal=invocation.proceedWithInvocation();
}
catch(Throwableex){
//targetinvocationexception
//回滾事務
completeTransactionAfterThrowing(txInfo,ex);
throwex;
}
finally{
cleanupTransactionInfo(txInfo);
}
//提交事務
commitTransactionAfterReturning(txInfo);
returnretVal;
}

else{
//It'saCallbackPreferringPlatformTransactionManager:passaTransactionCallbackin.
try{
Objectresult=((CallbackPreferringPlatformTransactionManager)tm).execute(txAttr,
newTransactionCallback(){
@Override
publicObjectdoInTransaction(TransactionStatusstatus){
TransactionInfotxInfo=prepareTransactionInfo(tm,txAttr,joinpointIdentification,status);
try{
returninvocation.proceedWithInvocation();
}
catch(Throwableex){
if(txAttr.rollbackOn(ex)){
//ARuntimeException:willleadtoarollback.
if(exinstanceofRuntimeException){
throw(RuntimeException)ex;
}
else{
thrownewThrowableHolderException(ex);
}
}
else{
//Anormalreturnvalue:willleadtoacommit.
returnnewThrowableHolder(ex);
}
}
finally{
cleanupTransactionInfo(txInfo);
}
}
});

//Checkresult:ItmightindicateaThrowabletorethrow.
if(resultinstanceofThrowableHolder){
throw((ThrowableHolder)result).getThrowable();
}
else{
returnresult;
}
}
catch(ThrowableHolderExceptionex){
throwex.getCause();
}
}
}

		

總結

最終可以總結一下整個流程,跟開始的猜想對照。

來源:blog.csdn.net/qq_20597727/article/details/84868035

責任編輯:haq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73960
  • spring
    +關注

    關注

    0

    文章

    341

    瀏覽量

    15935

原文標題:Spring的@Transactional如何實現的(必考)

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    結構體聲明與定義

    int year;//入學年份,用無符號整數表示 unsigned int years;//學制,用無符號整數表示 }; int main(void) { /** *在main函數聲明結構體
    發表于 12-11 07:52

    發布元服務配置隱私聲明

    元服務必須先使用AGC的隱私聲明托管服務生成自己的隱私聲明,才能在版本信息頁面選擇到。詳細內容參見配置隱私聲明(元服務)和配置用戶協議。 登錄AppGallery Connect,點擊“APP與元
    發表于 11-25 11:24

    聞泰科技關于荷蘭經濟部暫停行政令的聲明

    》對安世下達的行政令”的聲明。作為安世半導體的唯一控股股東,聞泰科技對此高度重視,現就相關事宜作出如下回應:? 一、我司對荷蘭經濟部決定的立場 我司注意到荷蘭經濟大臣的上述聲明是在中國商務部與荷蘭經濟部磋商后發表的,我司衷心感謝
    的頭像 發表于 11-24 09:21 ?586次閱讀

    一文了解3C認證自我聲明制度

    一、什么是3C認證自我聲明3C認證自我聲明(CCCSelf-Declaration),是國家市場監督管理總局自2019年起推行的新型管理方式。它允許部分低風險產品企業不再通過第三方認證機構發證,而是
    的頭像 發表于 11-11 11:58 ?1127次閱讀
    一文了解3C認證自我<b class='flag-5'>聲明</b>制度

    并發丟數據深度剖析:MySQL鎖機制與事務實戰踩坑及解決方案

    1、理論來源于實踐 現象 :于2025-08-13 21:45:35,事實邏輯表將自身的指標與維度同步到原子服務的實現時,出現同步過來的指標與維度丟失。 核心原因 :兩次重復的事實邏輯表同步時間非常
    的頭像 發表于 11-10 19:00 ?589次閱讀
    并發丟數據深度剖析:MySQL鎖機制與<b class='flag-5'>事務實</b>戰踩坑及解決方案

    NVMe高速傳輸之擺脫XDMA設計28: TLP 事務處理程序的執行流程

    最小橋設備模型的每個端口的輸入端對接一個 TLP事務處理程序, 該程序負責將接收到的 TLP 事務進行解析和路由轉發。
    的頭像 發表于 09-23 09:13 ?1067次閱讀
    NVMe高速傳輸之擺脫XDMA設計28: TLP <b class='flag-5'>事務</b>處理程序的執行流程

    NVMe高速傳輸之擺脫XDMA設計28: TLP 事務處 理程序的執行流程

    的上游端口時, 該響應類型事務需要根據事務的請求 ID字段與配置空間封裝類的相關字段進行比較, 實現基于 ID 的路由; 如果對應接收端
    發表于 09-21 08:51

    NVMe高速傳輸之擺脫XDMA設計25:UVM驗證平臺

    NVMe over PCIe采用 AXI4-Lite 接口、AXI4 接口和 PCIe3.0X4 接口,其中AXI4-Lite 和 AXI4 總線接口均可抽象為總線事務,而 PCIe 接口信號可被
    的頭像 發表于 08-04 16:52 ?806次閱讀
    NVMe高速傳輸之擺脫XDMA設計25:UVM驗證平臺

    Spring攔截器:你的請求休想逃過我的五指山!

    Spring框架,攔截器(Interceptor)是一種強大的機制,它允許開發者在請求處理的不同階段插入自定義邏輯。WebApplicationContext作為Spring Web應用的上下文容器,為攔截器的配置和管理提供
    的頭像 發表于 07-26 11:25 ?689次閱讀
    <b class='flag-5'>Spring</b>攔截器:你的請求休想逃過我的五指山!

    如何部署流媒體服務實現監控功能--基于米爾TI AM62x開發板

    本文將介紹基于米爾電子MYD-YM62X開發板(米爾基于TIAM62開發板)的部署流媒體服務實現監控功能方案的開發測試。摘自優秀創作者-HonestQiao米爾-TIAM62x開發板除了可以用官方
    的頭像 發表于 07-03 08:03 ?2941次閱讀
    如何部署流媒體服<b class='flag-5'>務實現</b>監控功能--基于米爾TI AM62x開發板

    嵌入單片機在電機控制系統的應用

    有效提升電機控制系統的性能,這也是建立高速實時電機控制系統的前提。 純分享帖,需要者可點擊附件免費獲取完整資料~~~*附件:嵌入單片機在電機控制系統的應用.pdf【免責聲明】本文系網絡轉載,版權歸原作者所有。本文所用視頻、圖
    發表于 06-11 15:07

    如何將一個FA模型開發的聲明范式應用切換到Stage模型

    模型切換概述 本文介紹如何將一個FA模型開發的聲明范式應用切換到Stage模型,您需要完成如下動作: 工程切換:新建一個Stage模型的應用工程。 配置文件切換:config.json切換
    發表于 06-04 06:22

    nvme IP開發之PCIe上

    所示。 圖2PCIe層次結構 事務層定義了PCIe總線事務,是PCIe總線層次結構的最高層。事務層采用傳輸層報文(Transaction Layer Packet,TLP)
    發表于 05-17 14:54

    聯創電子公司律師事務部獲省司法廳批準設立

    近日,江西省司法廳正式批準聯創電子設立公司律師事務部,聯創電子由此成為江西首家獲批設立公司律師事務部的民營上市公司,這標志著公司在依法治企方面邁出了堅實步伐,開啟了新的發展階段。 公司律師事務部由
    的頭像 發表于 04-28 11:23 ?1323次閱讀

    白皮書:在HMI應用實現高精度電容觸摸傳感器

    在HMI 應用實現高精度電容觸摸傳感器
    的頭像 發表于 03-17 16:46 ?2015次閱讀
    白皮書:在HMI應用<b class='flag-5'>中</b><b class='flag-5'>實現</b>高精度電容<b class='flag-5'>式</b>觸摸傳感器