一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

2021-08-01 12:08李新杰 Java教程

本文是小編給大家收藏整理的Spring事務(wù)面試考點,非常不錯,值得收藏,感興趣的朋友參考下吧

starting from a joke

問:把大象放冰箱里,分幾步?

答:三步啊,第一、把冰箱門打開,第二、把大象放進(jìn)去,第三、把冰箱門帶上。

問:實現(xiàn)spring事務(wù),分幾步?

答:三步啊,第一、找出需要事務(wù)的方法,第二、把事務(wù)加進(jìn)去,第三、執(zhí)行事務(wù)。

you may find it's not a joke, it's serious。

try to find an entrance

當(dāng)你面對一個完全不熟悉的事物時,一定要想辦法找到一個突破口,然后逐步深入。那spring事物的突破口在哪里呢?很明顯在@enabletransactionmanagement注解里,因為是它啟用了事物功能。

請看下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

發(fā)現(xiàn)注解還引入了一個類transactionmanagementconfigurationselector。

再來看這個類,如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

發(fā)現(xiàn)如果采用代理的方式時,又引入了一個類proxytransactionmanagementconfiguration。

接著看這個類(重點來了),如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

發(fā)現(xiàn)這個類往容器中注冊了3個bean,第一個是beanfactorytransactionattributesourceadvisor。它以advisor結(jié)尾說明它是spring aop范疇里的東西。

在aop里,advisor = pointcut + advice,pointcut是切入點,表示要攔截的方法,advice是增強,表示要加進(jìn)去的事物功能。

再看看另外兩個注冊的bean,就是和這兩個相關(guān)的。其中transactioninterceptor就是一個advice,因為它實現(xiàn)了advice接口,包含了把事物加進(jìn)去的邏輯。

transactionattributesource雖然不是一個pointcut,但是它被pointcut所用,用于檢測一個類的方法上是否有@transactional注解,來確定該方法是否需要事物增強。

從下圖中也可以看出這一點:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

可以看到這個bean通過下面的set方法被設(shè)置進(jìn)去,然后又用在了pointcut的類里了。

整體來看,此部分的結(jié)構(gòu)和功能劃分還是非常清晰的。下面來逐一研究。

aop切點

transactionattributesourcepointcut類以pointcut結(jié)尾,說明它是一個切入點,就是標(biāo)識要被攔截的方法。類名的前綴部分表明了這個切入點的實現(xiàn)原理。

看下這個前綴是transactionattributesource,它以source結(jié)尾,說明它是一個源(即源泉,有向外提供東西的意思)。它的前綴是transactionattribute,即事務(wù)屬性。

由此可見,這個源可以向外提供事務(wù)屬性,其實就是判斷一個類的方法上是否標(biāo)有@transactional注解,如果有的話還可以獲取這個注解的屬性(即事務(wù)屬性)。

整體來說就是,pointcut攔截住了方法,然后使用這個“源”去方法和類上獲取事務(wù)屬性,如果能獲取到,說明此方法需要參與事務(wù),則進(jìn)行事務(wù)增強,反之則不增強。

下面這張圖可以證明我們的想法:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

可以看出matches方法的兩個參數(shù)就是一個方法(method)和一個類(class<?>)。最后從方法和類上獲取事務(wù)屬性,再進(jìn)行是否為null判斷。

現(xiàn)在這個“源”還是個黑盒子,下面來揭開它的面紗。它的實現(xiàn)類是annotationtransactionattributesource,以annotation開頭,說明是基于注解實現(xiàn)的。

下面圖是它的源碼的一部分:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

第一個方法從類上找事務(wù)屬性,第二個方法從方法上找事務(wù)屬性,它倆都調(diào)用了第三個方法來實現(xiàn)。

ps:我們都知道,方法上的注解優(yōu)先級高于類上的,是因為找注解時先找方法上的,找不到時再去類上找。所以方法上的優(yōu)先級高。此部分代碼邏輯在父類里寫著呢,這里不再展示了。

第三個方法使用多個事務(wù)注解解析器(transactionannotationparser)去解析注解,為啥是多個解析器呢?因為事務(wù)注解不僅spring提供了,java后來也提供了,就是javax.transaction.transactional。

spring對自己注解的解析器實現(xiàn)類是springtransactionannotationparser,如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

可以看出使用工具類來讀取注解@transactional的屬性,然后逐個解析出屬性值并進(jìn)行類型轉(zhuǎn)換,接著把這些屬性封裝到一個類里,這個類其實就是事務(wù)屬性,即transactionattribute。

這個事務(wù)屬性繼承了事務(wù)定義接口,事務(wù)定義接口我們應(yīng)該都很熟悉,如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

這也證明了以前文章里說過的話,@transactional注解的作用有兩個,一是表明要參與事務(wù),二是表明如何參與事務(wù),這些注解屬性就是來規(guī)定如何參與的。

這個事務(wù)屬性transactionattribute是個接口,它的實現(xiàn)類在這里就不再詳說了。

aop增強

advice就是aop中的增強,transactioninterceptor實現(xiàn)了advice接口,所以它就是事務(wù)增強。

先來看下該接口,如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

發(fā)現(xiàn)它只是一個空的標(biāo)記接口。而且它的包名是org.aopalliance,是一個aop聯(lián)盟組織,它制定的aop規(guī)范。

先來了解下aop領(lǐng)域的一些相關(guān)內(nèi)容,pointcut是切入點,表示要攔截的方法。它是一個靜態(tài)的概念,即程序不運行時它也是存在的。

那么在真正運行時,已經(jīng)攔截住了,此時該怎么表示這個情況呢?是用joinpoint來表示的,所以joinpoint是一個運行時的概念,只有在運行時才存在。

請看joinpoint接口,如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

第一個方法proceed()是“繼續(xù)”的意思,調(diào)用它表示去執(zhí)行被攔截住的方法本身,返回方法本身的返回值。

第二個方法getthis()是獲取this對象,即方法運行時所在的目標(biāo)對象。如果是靜態(tài)方法,則為null,因為靜態(tài)方法是屬于類本身的,運行時不需要對象。

第三個方法getstaticpart(),其實就表示了被攔截住的方法,即就是一個method。method其實算是“元數(shù)據(jù)”,是屬于類型本身的,也有“靜態(tài)”的意思。

再看一個接口,invocation,它繼承了joinpoint,如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

方法getarguments()就表示運行時傳遞給被攔截住方法的參數(shù)。

再看一個接口,methodinvocation,它繼承了invocation,如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

方法getmethod()返回一個method,它就是當(dāng)前正在執(zhí)行的方法,是對本攔截方法的一個友好實現(xiàn),返回相同的結(jié)果。

可見methodinvocation接口已經(jīng)包含了一個方法調(diào)用的全量信息,方法,參數(shù),目標(biāo)對象。這其實就是運行時被攔截住的東西。

再看下面這個接口,methodinterceptor,方法攔截器,如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

它只有一個方法invoke,方法參數(shù)就是上面介紹的methodinvocation。所以攔截器可以使用這個參數(shù)來對目標(biāo)方法進(jìn)行調(diào)用,當(dāng)然在調(diào)用前/后可以加入自己的邏輯。

transactioninterceptor類就實現(xiàn)了這個接口,因此可以在對目標(biāo)方法的調(diào)用前后插入事務(wù)邏輯代碼來進(jìn)行事務(wù)增強。

下面是事務(wù)攔截器對該方法的實現(xiàn),如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

它調(diào)用的invokewithintransaction方法是在父類里的,看下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

這個圖里做的事情較多,逐個來看:

前兩行獲取事務(wù)屬性“源”,再用這個“源”來獲取事務(wù)屬性。咦,有點奇怪,上面不是已經(jīng)獲取過了嗎?是的,上面是在pointcut里獲取的,那只是用于判斷那個方法是否要被攔截而已。這里獲取的屬性才是真正用于事務(wù)的。

第三行是根據(jù)事務(wù)屬性,來確定出一個事務(wù)管理器來。

接下來是使用事務(wù)管理器打開事務(wù)。

接下來是對被攔截住的目標(biāo)方法的調(diào)用執(zhí)行,當(dāng)然要try/catch住這個執(zhí)行。

如果拋出了異常,則進(jìn)行和異常相關(guān)的事務(wù)處理,然后將這個異常繼續(xù)向上拋出。

如果沒有拋出異常,則進(jìn)行事務(wù)提交。

最后的else分支是對編程式事務(wù)的調(diào)用,事務(wù)的打開/提交/回滾是開發(fā)人員自己寫代碼控制,所以就不需要事務(wù)管理器操心了。

下面請看和異常相關(guān)的事務(wù)處理,如下圖:

【面試】Spring事務(wù)面試考點吐血整理(建議珍藏)

判斷異常類型是否需要回滾,需要的話就回滾事務(wù),不需要的話就繼續(xù)提交事務(wù)。

這里的整體結(jié)構(gòu)和邏輯流程也是比較清晰的,那是因為一方面得益于aop領(lǐng)域的概念,另一方面是事務(wù)管理器屏蔽了事務(wù)的所有復(fù)雜性。

ps:事務(wù)管理器的內(nèi)容其實還是挺復(fù)雜的,下篇文章再詳細(xì)解說。

好了,以上是小編給大家介紹的spring事務(wù)面試整理,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!

原文鏈接:https://www.cnblogs.com/lixinjie/archive/2019/04/16/a-enough-source-read-of-spring-tx-for-interview.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜宅男宅女看在线观看 | 动漫美女被吸乳 | 高清国产精品久久久久 | 免费欧美一级片 | 天天av天天翘天天综合网 | 亚洲国产在线视频精品 | 激情影院免费 | 放荡的女老板bd中文字幕 | 色图18p | 亚洲国产AV无码综合在线 | 和直男装修工在工地啪 | 久久re这里精品在线视频7 | 8天堂资源在线官网 | seetube18日本第一次 | 久久成人伊人欧洲精品AV | 亚洲天堂男人 | 亚洲情射 | 国产精品 视频一区 二区三区 | 久99视频精品免费观看福利 | 午夜免费啪视频观看视频 | oneday高清在线观看 | 国产精品怡红院在线观看 | 美女沟厕撒尿全过程高清图片 | 国产福利一区二区精品视频 | xx18-19xxxxhd| 91香蕉国产在线观看人员 | 美女禁区视频无遮挡免费看 | 国产极品久久 | 99手机在线视频 | 嫩草蜜桃 | 波多野结衣一区免费作品 | 国产精品第 | 日本在线你懂的 | 99久久精品国语对白 | 3d美女触手怪爆羞羞漫画 | 男人的j伸到女人的屁股眼 男人吃奶动态图 | 深夜在线小视频 | 波多野结衣在线观看视频 | 动漫美女胸被狂揉扒开吃奶动态图 | 欧美xbxbxbbxxbb精品 | 精品国产欧美精品v |