北大青鳥(niǎo)spring入門(mén)課程TP4.ppt_第1頁(yè)
北大青鳥(niǎo)spring入門(mén)課程TP4.ppt_第2頁(yè)
北大青鳥(niǎo)spring入門(mén)課程TP4.ppt_第3頁(yè)
北大青鳥(niǎo)spring入門(mén)課程TP4.ppt_第4頁(yè)
北大青鳥(niǎo)spring入門(mén)課程TP4.ppt_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第 四 章,Spring AOP 的應(yīng)用,回顧,AOP的目的即在正常的業(yè)務(wù)操作之外增加的附加操作 通過(guò)切入點(diǎn)(pointcut)指名進(jìn)行哪些切面(aspect)操作 ProxyFactoryBean interceptorNames targetName proxyInterfaces 攔截器(Interceptor),通知(Advice),和切面的不同(Aspect),2,AOP的應(yīng)用,事務(wù)切面 日志切面 其它附加操作切面,3,事務(wù)切面,在介紹事務(wù)切面之前,回顧網(wǎng)上銀行的項(xiàng)目,并使用Spring IOC注入業(yè)務(wù)實(shí)現(xiàn)類所需的sessionFactory 實(shí)現(xiàn)步驟和問(wèn)題思考: 實(shí)現(xiàn)業(yè)務(wù)接口和業(yè)務(wù)實(shí)現(xiàn)類(AccountService、LogService) sessionFactory如何注入的,應(yīng)該注入給誰(shuí)? 事務(wù)由誰(shuí)來(lái)管理?,4,優(yōu)化,現(xiàn)在項(xiàng)目經(jīng)理提出需求,希望改進(jìn)代碼的結(jié)構(gòu),達(dá)到如下目標(biāo): transfer方法(或其它業(yè)務(wù)方法)在執(zhí)行時(shí),事務(wù)自動(dòng)開(kāi)始 在正確完成后,事務(wù)提交,并且關(guān)閉hibernate session 在出現(xiàn)RuntimeException(或其子類)異常時(shí),事務(wù)回滾,并關(guān)閉hibernate session 其他異常,仍執(zhí)行提交關(guān)閉的操作,5,Spring的解決方案,方案A:使用事務(wù)攔截器并代理業(yè)務(wù)實(shí)現(xiàn)類 方案B:使用事務(wù)advice 和aspect 切面來(lái)實(shí)現(xiàn)事務(wù)攔截,6,方案A,第一步,改寫(xiě)AccountService業(yè)務(wù)實(shí)現(xiàn)類 第二步,定義ProxyFactoryBean以返回AccountService代理對(duì)象 proxyInterfaces targetName interceptorNames 這里添加事務(wù)攔截器,7,事務(wù)攔截器,第三步定義事務(wù)攔截器,8, PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW ,事務(wù)屬性以及 事務(wù)管理器,Show Time,修改perties,以便觀察Spring執(zhí)行過(guò)程 .springframework.aop=debug .springframework.transaction=debug .springframework.orm.hibernate3=debug,9,事務(wù)管理器,Spring由于需要為多種數(shù)據(jù)層的實(shí)現(xiàn)提供集成支持,針對(duì)不同的情況,定義了各種事務(wù)管理器,一定要選擇正確的事務(wù)管理器 比如: DataSourceTransactionManager 對(duì)應(yīng)JDBC事務(wù) HibernateTransactionManager 對(duì)應(yīng)Hibernate提供的事務(wù) JtaTransactionManager 對(duì)應(yīng)JTA事務(wù) 大多數(shù)事務(wù)管理器都需要設(shè)置dataSource(數(shù)據(jù)源)屬性,對(duì)于HibernateTransactionManager可以只設(shè)置sessionFactory屬性,10,事務(wù)屬性,常見(jiàn)的事務(wù)屬性有: 事務(wù)的傳播行為 事務(wù)的隔離級(jí)別 事務(wù)是否只讀 針對(duì)只讀事務(wù),Spring在某些情況下會(huì)提供優(yōu)化,11,事務(wù)的傳播行為,以下的定義可以在TransactionDefinition中找到 PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED PROPAGATION_NEVER,12,事務(wù)的傳播行為,PROPAGATION_REQUIRED表示如果沒(méi)有事務(wù),則開(kāi)始新的事務(wù),事務(wù)已經(jīng)存在,則加入當(dāng)前事務(wù) PROPAGATION_SUPPORTS 表示如果事務(wù)已經(jīng)存在,則加入當(dāng)前事務(wù),如果沒(méi)有事務(wù),不會(huì)開(kāi)始新事務(wù) PROPAGATION_MANDATORY 表示必須有事務(wù)存在,并加入當(dāng)前事務(wù),否則拋出異常 PROPAGATION_REQUIRES_NEW 表示每次都開(kāi)始一個(gè)全新事務(wù) PROPAGATION_NOT_SUPPORTED 表示不會(huì)開(kāi)始或加入事務(wù) PROPAGATION_NEVER 表示不會(huì)開(kāi)始或加入事務(wù),如果事務(wù)已存在,拋出異常,13,事務(wù)的隔離級(jí)別,以下的定義可以在TransactionDefinition中找到 ISOLATION_READ_UNCOMMITTED ISOLATION_READ_COMMITTED ISOLATION_REPEATABLE_READ ISOLATION_SERIALIZABLE,14,事務(wù)的隔離級(jí)別,首先明確隔離級(jí)別指的都是同一個(gè)事務(wù)中 ISOLATION_READ_UNCOMMITTED表示會(huì)讀取到未提交的數(shù)據(jù) ISOLATION_READ_COMMITTED表示讀取到的是已經(jīng)提交的數(shù)據(jù) ISOLATION_REPEATABLE_READ表示多次讀取的數(shù)據(jù)是相同的 ISOLATION_SERIALIZABLE表示就好像沒(méi)有別的用戶在修改數(shù)據(jù)庫(kù)中的數(shù)據(jù)一樣,15,如何使用隔離級(jí)別,對(duì)于大多數(shù)數(shù)據(jù)庫(kù)來(lái)說(shuō),事務(wù)的隔離級(jí)別是ISOLATION_READ_COMMITTED,我們不需要做更多的設(shè)置,就可以很好的工作了 將事務(wù)的隔離級(jí)別設(shè)置為ISOLATION_REPEATABLE_READ可以防止丟失更新,但這樣做會(huì)嚴(yán)重影響系統(tǒng)的并發(fā)性,因此更多地是采用樂(lè)觀鎖的形式 ISOLATION_SERIALIZABLE并非你想象中的鎖定一切!,16,繼續(xù)完成需求,第四步,完成LogService業(yè)務(wù)實(shí)現(xiàn)類及其代理對(duì)象的定義,修改事務(wù)攔截器 第五步,定義一個(gè)Advice實(shí)現(xiàn)ThrowsAdvice和MethodBeforeAdvice 以便處理日志和其它附加邏輯 第六步,將此Advice 添加至合適的位置,17,流程分析,當(dāng)事務(wù)攔截器中的設(shè)置如下時(shí),18,PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW,執(zhí)行順序,執(zhí)行AccountService代理的transfer方法 檢查此代理定義的所有攔截器(有事務(wù)攔截器,和一個(gè)Advice) 根據(jù)transfer方法事務(wù)的傳播規(guī)則(REQUIRED),開(kāi)啟一個(gè)新的事務(wù)Tx_A,打開(kāi)Session_A 因?yàn)锳dvice實(shí)現(xiàn)了MethodBeforeAdvice接口,因此首先執(zhí)行Advice中的before方法 Before方法中,使用了LogService代理的log方法 檢查L(zhǎng)ogService代理定義的攔截器(有事務(wù)攔截器) 根據(jù)log方法的傳播規(guī)則(REQUIRES_NEW),又開(kāi)啟一個(gè)新的事務(wù)Tx_B,打開(kāi)Session_B 執(zhí)行l(wèi)og方法 當(dāng)log方法成功執(zhí)行,Tx_B提交,Session_B關(guān)閉 執(zhí)行transfer方法 當(dāng)transfer方法成功執(zhí)行,Tx_A提交,Session_A關(guān)閉,19,當(dāng)transfer發(fā)生異常,執(zhí)行AccountService代理的transfer方法 檢查此代理定義的所有攔截器(有事務(wù)攔截器,和一個(gè)Advice) 根據(jù)transfer方法事務(wù)的傳播規(guī)則(REQUIRED),開(kāi)啟一個(gè)新的事務(wù)Tx_A,打開(kāi)Session_A 因?yàn)锳dvice實(shí)現(xiàn)了MethodBeforeAdvice接口,因此首先執(zhí)行Advice中的before方法 Before方法中,使用了LogService代理的log方法 檢查L(zhǎng)ogService代理定義的攔截器(有事務(wù)攔截器) 根據(jù)log方法的傳播規(guī)則(REQUIRES_NEW),又開(kāi)啟一個(gè)新的事務(wù)Tx_B,打開(kāi)Session_B 執(zhí)行l(wèi)og方法 當(dāng)log方法成功執(zhí)行,Tx_B提交,Session_B關(guān)閉 執(zhí)行transfer方法 當(dāng)transfer方法拋出異常,執(zhí)行Advice 的afterThrowing 方法 Tx_A回滾,Session_A關(guān)閉,20,流程分析,當(dāng)事務(wù)攔截器中的設(shè)置如下時(shí),21,PROPAGATION_REQUIRED PROPAGATION_REQUIRED,執(zhí)行順序,執(zhí)行AccountService代理的transfer方法 檢查此代理定義的所有攔截器(有事務(wù)攔截器,和一個(gè)Advice) 根據(jù)transfer方法事務(wù)的傳播規(guī)則(REQUIRED),開(kāi)啟一個(gè)新的事務(wù)Tx_A,打開(kāi)Session_A 因?yàn)锳dvice實(shí)現(xiàn)了MethodBeforeAdvice接口,因此首先執(zhí)行Advice中的before方法 Before方法中,使用了LogService代理的log方法 檢查L(zhǎng)ogService代理定義的攔截器(有事務(wù)攔截器) 根據(jù)log方法的傳播規(guī)則( REQUIRED ),加入當(dāng)前的事務(wù)Tx_A 執(zhí)行l(wèi)og方法 執(zhí)行transfer方法 當(dāng)transfer方法成功執(zhí)行,Tx_A提交,Session_A關(guān)閉,22,當(dāng)transfer發(fā)生異常,執(zhí)行AccountService代理的transfer方法 檢查此代理定義的所有攔截器(有事務(wù)攔截器,和一個(gè)Advice) 根據(jù)transfer方法事務(wù)的傳播規(guī)則(REQUIRED),開(kāi)啟一個(gè)新的事務(wù)Tx_A,打開(kāi)Session_A 因?yàn)锳dvice實(shí)現(xiàn)了MethodBeforeAdvice接口,因此首先執(zhí)行Advice中的before方法 Before方法中,使用了LogService代理的log

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論