<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 156,  comments - 601,  trackbacks - 0

    前言:

    本文章會通過連載的方式來深入了解和學(xué)習(xí)Spring相關(guān)核心技術(shù)和實現(xiàn)原理。包括SpringBean生命周期管理,聲明性事務(wù)管理,AOP管理,注解應(yīng)用實現(xiàn),以及在其上面進(jìn)行擴(kuò)展的相關(guān)應(yīng)用。

    本篇技術(shù)文章將介紹Spring聲明式事務(wù)管理實現(xiàn)技術(shù)細(xì)節(jié)的剖析。

    首先看一下Spring基于XML方式的聲明式事務(wù)配置方法。(基于注解的也是相同,下篇在介紹Spring注解應(yīng)用擴(kuò)展實現(xiàn)時,會再介紹基于注解的Spring聲明式事務(wù)的實現(xiàn)細(xì)節(jié))

    首先配置 BeanNameAutoProxyCreator 實現(xiàn)基于Bean 名稱規(guī)則匹配的AOP攔截

    示例代碼如下:



    從上面的配置示例中,可以發(fā)現(xiàn)Spring的聲明式事務(wù)由一個叫TransactionInterceptor AOP攔截器實現(xiàn), 我們代碼的整體分析過程也是從這個類開始

    TransacionInterceptor的類描述如下,其實現(xiàn)了MethodInterceptor接口


    代碼主體邏輯都是invoke方法里

    下面是invoke方法的主要邏輯說明

    首先獲得攔載的方法名和類名,根據(jù)在xml文件的匹配規(guī)則,找出事務(wù)的配置規(guī)則,創(chuàng)建TransactionAttribute對象(如事務(wù)的讀寫屬性,傳播屬性,事務(wù)隔離級別等)

    如果匹配事務(wù)規(guī)則,則調(diào)用 createTransactionIfNecessary方法創(chuàng)建事務(wù)

    整理創(chuàng)建事務(wù)的過程,則會調(diào)用SpringPlatformTransactionManager的接口實現(xiàn)類,示例中配置的是HibernateTransactionManager

    整理個事務(wù)創(chuàng)建過程中,會用到兩個重要的對象,說明如下:

    HibernateTransactionObject 保存事務(wù)狀態(tài)(是否新事務(wù),是否新的SessionHolder,以前對應(yīng)的SessionHolder實例) SessionHolder則是用于保持Transaction對象實例,以及管理事務(wù)所需要相關(guān)信息如引用次數(shù),是否只能回滾等。

    TransactionSynchronizationManager 管理當(dāng)前線程的事務(wù)運行情況,所有的事務(wù)傳播嵌套處理都由它來控制管理,它會保存以下信息:

                            當(dāng)前的事務(wù)名稱 currentTransactionName

                            當(dāng)前只讀事務(wù)的狀態(tài) currentTransactionReadOnly

                            當(dāng)前事務(wù)使用的隔離級別 currentTransactionIsolationLevel

                            當(dāng)前同步控制TransactionSynchronization對象synchronizations

                            當(dāng)前的ResourceHolder對象實列,保存連接對象resources

    下面是創(chuàng)建事務(wù)的序列圖


    核心代碼及說明如下:

    在創(chuàng)建事務(wù)過程中,會檢測之前有沒有事務(wù)開啟,如果有則會根據(jù)當(dāng)前方法上設(shè)置的事務(wù)的傳播信息來決定是否使用原來事務(wù),還是掛起原來事務(wù),或開啟新的事務(wù)等。

    AbstractPlatformTransactionManager.getTransaction方法


    是否新開啟事務(wù)最終會將該狀態(tài)設(shè)置到HibernateTransactionObjectnewSession屬性上。這樣在嵌套的方法退出時,可以由這個屬性來決定要不要真正的提交事務(wù)。

    封裝創(chuàng)建JDBC的事務(wù)代碼如下:HibernateTransactionManager.doBegin()方法


    事務(wù)的提交和回滾實現(xiàn)

    事務(wù)提交 TransactionInterceptorcommitTransactionAfterReturning來實現(xiàn)

    主要代碼如下:AbstractPlatformTransactionManager#commit方法


    事務(wù)回滾TransactionInterceptorcompleteTransactionAfterThrowing來實現(xiàn)

    主要代碼如下:AbstractPlatformTransactionManager#rollback方法


    基本上Spring的聲明式事務(wù)的基本實現(xiàn)原理都已經(jīng)介紹完了,下面附上相關(guān)的源碼文件列表:

    TransactionInterceptor.java

    HiberanteTransactionManager.java

    AbstractPlatformTransactionManager.java

    TransactionSynchronizationManager.java

    SessionHolder.java

    ConnectionHolder.java

    TransactionStatus.java



    Good Luck!

    Yours Mattthew!

    posted on 2011-04-29 10:54 x.matthew 閱讀(2186) 評論(1)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 免费国产美女爽到喷出水来视频| 亚洲日本成本人观看| 亚洲精品无码Av人在线观看国产| 亚洲国产精品不卡毛片a在线| 国产又大又粗又硬又长免费 | 亚洲婷婷天堂在线综合| 亚洲精品福利网站| 亚洲国产日产无码精品| 亚洲一区二区三区免费观看| 中文字幕在线观看亚洲视频| 亚洲一本到无码av中文字幕| 亚洲国产精品无码久久| 美女视频黄频a免费观看| 免费毛片毛片网址| 成人妇女免费播放久久久| a毛片全部免费播放| 久久99国产综合精品免费| 精品免费人成视频app| 成人a视频片在线观看免费| 午夜成年女人毛片免费观看| 国产最新凸凹视频免费| 亚洲国产成人a精品不卡在线| 国产亚洲老熟女视频| 久久久久亚洲精品无码系列| 亚洲成a人不卡在线观看| 亚洲码和欧洲码一码二码三码| 国产精品亚洲综合一区在线观看 | 一区二区三区在线观看免费| 亚洲av区一区二区三| 亚洲成av人片不卡无码久久| 一级免费黄色大片| 亚洲国产电影在线观看| 亚洲国产精品一区二区第一页免 | 亚洲youjizz| 日本一道综合久久aⅴ免费| 国内一级一级毛片a免费| 亚洲色偷偷av男人的天堂| 亚洲国产精品成人综合色在线| 日韩a毛片免费观看| 日本免费高清视频| 女人18毛片水最多免费观看 |