版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
-1-掌握AOP的基本概念及術(shù)語掌握各種Advice類的編寫方法了解切面的不同類型掌握配置切面的方法了解Spring對事務(wù)管理的支持掌握編程式事務(wù)管理掌握聲明式事務(wù)的概念和配置方式目標(biāo)-2-AOPAOP(AspectOrientedProgramming)即“面向切面編程”AOP利用一種稱為“橫切”的技術(shù),剖解開封裝對象的內(nèi)部,并將那些影響了多個類的行為封裝到一個可重用模塊中,并將其命名為“Aspect”,即切面(或稱為方面)。通過切面可以將那些與業(yè)務(wù)無關(guān)卻為業(yè)務(wù)模塊共同調(diào)用的邏輯封裝起來,從而減少了系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,有利于系統(tǒng)的可維護性和可擴展性O(shè)OP提高了代碼的重用,而AOP將分散在各個業(yè)務(wù)邏輯中的相同代碼,通過橫向切割的方式抽取成一個獨立的模塊,使得業(yè)務(wù)邏輯類更加簡潔明-3-AOP相關(guān)概念連接點(Joinpoint)切入點(Pointcut)增強(Advice)目標(biāo)對象(Target)引入(Introduction)織入(Weaving)代理(Proxy)切面(Aspect)在AOP編程過程中,需要開發(fā)人員參與的有三個方面:定義普通業(yè)務(wù)類定義切入點,一個切入點可能橫切多個業(yè)務(wù)組件定義增強,增強就是在AOP框架為普通業(yè)務(wù)組件織入的處理邏輯-4-SpringAOP增強類型-1根據(jù)增強在目標(biāo)類連接點的位置不同,Spring框架支持五種類型的增強:前置增強后置增強返回后增強拋出異常后增強環(huán)繞增強定義方式:基于XML配置文件的管理方式:使用Spring配置文件來定義切入點和增強基于Annotation的“零配置”方式:使用@Aspect、@Pointcut等注解來定義切入點和增強-5-SpringAOP增強類型-2<aop:before…/>:配置Before增強處理<aop:after…/>:配置After增強處理<aop:after-returning…/>:配置AfterReturning增強處理<aop:after-throwing…/>:配置AfterThrowing增強處理<aop:around…/>:配置Aroud增強處理屬性名描述pointcut該屬性指定一個切入點表達式,Spring將在匹配該表達式的連接點時織入該增強pointcut-ref該屬性指定一個已經(jīng)存在的切入點名稱,通常pointcut和pointcut-ref兩個屬性只需使用其中之一method該屬性指定一個方法名,它對應(yīng)切面中所定義的增強邏輯方法throwing該屬性只對<after-throwing…/>元素有效,用于指定一個形參名,AfterThrowing增強處理方法可以通過該形參訪問目標(biāo)方法所拋出的異常returning該屬性只對<after-returning…/>元素有效,用于指定一個形參名,AfterReturning增強處理方法可以通過該形參訪問目標(biāo)方法的返回值-6-基于XML–配置切面屬性名描述id定義該切面的標(biāo)識名ref指定該屬性所引用的普通Bean作為切面Beanorder指定該切面Bean的優(yōu)先級,order值越小,該切面對應(yīng)的優(yōu)先級越高publicclassAspectBean{ publicvoidcheckAuth(){System.out.println("權(quán)限檢查...");} publicvoidrelease(){System.out.println("最后釋放資源...");} publicvoidlog(Objectresult){ if(result==null) System.out.println("數(shù)據(jù)庫中無結(jié)果!"); else System.out.println("數(shù)據(jù)庫中有結(jié)果!"); } publicvoidprocessException(Throwableex){ System.out.println("異常信息為:"+ex.getMessage()); } publicvoidproceedInTrans(ProceedingJoinPointjoinpoint) throwsThrowable{ System.out.println("開始事務(wù)..."); ceed(); System.out.println("提交事務(wù)..."); }}<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance" xmlns:aop="/schema/aop"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.5.xsd/schema/aop /schema/aop/spring-aop-2.5.xsd"> <aop:config> <aop:aspectid="adviceAspect"ref="aspectBean"> <!--還沒有配置增強--> </aop:aspect> </aop:config> <!--配置日志切面--> <beanid="aspectBean" class="com.dh.ch08.aspect.AspectBean"/></beans>-7-基于XML–配置增強publicinterfaceUserService{ /** *模擬刪除操作 */ publicvoiddel(); /** *模擬添加操作 */ publicvoidadd(); /** *模擬更新操作 */ publicvoidupdate(); /** *模擬查詢操作 */ publicObjectselect();}publicclassUserServiceImplimplementsUserService{ publicvoiddel(){ System.out.println("刪除一個User對象"); } publicvoidadd(){ System.out.println("添加一個User對象"); } publicvoidupdate(){ System.out.println("更新一個User對象"); } publicObjectselect(){ System.out.println("模擬查詢了多個User對象"); returnnull; }}<aop:configproxy-target-class="true"> <aop:aspectid="adviceAspect"ref="aspectBean"> <!--配置Before增強,以切面Bean中的checkAuth()方法作為增強處理方法--> <aop:beforemethod="checkAuth" pointcut="execution(*com..*.*Service.*(..))"/> <!--配置AfterReturning增強,以切面中的log()方法作為增強處理方法--> <aop:after-returningmethod="log" pointcut="execution(*com..*.*Service.select(..))" returning="result"/> <!--配置AfterThrowing增強,以切面中的processException方法作為增強處理方法--> <aop:after-throwingmethod="processException" pointcut="execution(*com..*.*Service.*(..))" throwing="ex"/> <!--配置Around增強,以切面中的processTrans()方法作為增強處理方法--> <aop:aroundmethod="proceedInTrans" pointcut="execution(*com..*.*Service.*(..))"/> <!--配置After增強,以切面Bean中的release()方法作為增強處理方法--> <aop:aftermethod="release" pointcut="execution(*com..*.*Service.*(..))"/> </aop:aspect></aop:config><!--配置日志切面--><beanid="aspectBean"class="com.dh.ch08.aspect.AspectBean"/><!--配置UserService類--><beanid="userService"class="com.dh.ch08.service.UserServiceImpl"/>-8-基于XML–配置切入點<aop:configproxy-target-class="true">
<aop:pointcutid="mypointcut" expression="execution(*com..*.*Service.*(..))"/> <aop:aspectid="adviceAspect"ref="aspectBean"> <!--配置before增強--> <aop:beforemethod="checkAuth"
pointcut-ref="mypointcut"/> </aop:aspect></aop:config>-9-基于XML–切入點指示符名稱描述execution用來匹配執(zhí)行方法的連接點,它是SpringAOP中最主要的切入點指示符within限定匹配特定類型的連接點,當(dāng)使用SpringAOP的時候,只能匹配方法執(zhí)行的連接點this用于限定AOP代理必須是指定類型的實例,用于匹配該對象的所有連接點。當(dāng)使用SpringAOP的時候,只能匹配方法執(zhí)行的連接點target用于限定目標(biāo)對象必須是指定類型的實例,用于匹配該對象的所有連接點。當(dāng)使用SpringAOP的時候,只能匹配方法執(zhí)行的連接點args用于對連接點的參數(shù)類型進行限制,要求參數(shù)類型是指定類型的實例。當(dāng)使用SpringAOP的時候,只能匹配方法執(zhí)行的連接點execution(public**(..))execution(*find*(..))execution(*com.dh.ch08.service.UserService.*(..))execution(*com.dh.ch08.service.UserService+.*(..))execution(*com.dh.ch08.*(..))execution(*com.dh.ch08..*(..))execution(*com..*.*Service.find*(..))execution(*com..ch08..*Service.find*(..))execution(*foo(String,int))execution(*foo(String,..))within(com.dh.ch08..*)this(com.dh.ch08.service.UserService)target(com.dh.ch08.service.UserService)args(com.dh.ch08.pojos.User)-10-基于XML–組合切入點execution(*com.dh..*(..))&&args(com.dh.ch08.pojos.User)Spring支持使用3個邏輯運算符來組合切入點表達式:&&:要求連接點同時匹配兩個切入點表達式||:只要求連接點匹配任意一個切入點表達式!:要求連接點不匹配指定切入點表達式-11-基于Annotation–配置切面<aop:aspectj-autoproxy/>AspectJ是一個基于Java語言的AOP框架,它擴展了標(biāo)準(zhǔn)Java,從語言層面提供了強大的AOP功能。在配置文件中配置啟動AspectJ@AspectpublicclassAspectBean{......省略其他內(nèi)容}-12-基于Annotation–配置增強AspectJ提供的幾個主要的增強注解:@Before前置增強@AfterReturning返回后增強@Around環(huán)繞增強@AfterThrowing拋出增強@After
后置增強@AspectpublicclassAspectBean{
@Before("execution(*com..*.*Service.*(..))") publicvoidcheckAuth(){System.out.println("權(quán)限檢查...");}
@After("execution(*com..*.*Service.*(..))") publicvoidrelease(){System.out.println("最后釋放資源...");}
@AfterReturning(returning="result",pointcut="execution(*com..*.*Service.select(..))") publicvoidlog(Objectresult){ if(result==null) System.out.println("數(shù)據(jù)庫中無結(jié)果!"); else System.out.println("數(shù)據(jù)庫中有結(jié)果!"); }
@AfterThrowing(pointcut="execution(*com..*.*Service.*(..))",throwing="ex") publicvoidprocessException(Throwableex){ System.out.println("異常信息為:"+ex.getMessage()); }
@Around("execution(*com..*.*Service.*(..))") publicvoidproceedInTrans(ProceedingJoinPointjoinpoint) throwsThrowable{ System.out.println("開始事務(wù)..."); ceed(); System.out.println("提交事務(wù)..."); }}-13-基于Annotation–配置切入點@AspectpublicclassAspectBean{ /** *使用@Pointcut來配置切入點 */ @Pointcut("execution(*com..*.*Service.*(..))") privatevoidcrud(){}; /** *模擬進行權(quán)限檢查 */
@Before("crud()") publicvoidcheckAuth(){ System.out.println("權(quán)限檢查..."); }......省略}切入點可以通過@Pointcut進行聲明。一個切入點的聲明有兩部分組成,一個是包含名字和任意參數(shù)的簽名,另一個是切入點表達式示例8.3-14-Spring事務(wù)策略JavaEE應(yīng)用的事務(wù)策略有全局事務(wù)和局部事務(wù)兩種全局事務(wù)通常由應(yīng)用服務(wù)器管理,需要底層應(yīng)用服務(wù)器(例如WebLogic和WebSphere等)的JTA支持,EJB事務(wù)就是建立在JTA的基礎(chǔ)上,而JTA又必須通過JNDI獲取,這就意味著無論用戶的應(yīng)用是跨多個事務(wù)性資源(如關(guān)系型數(shù)據(jù)庫和消息隊列等)的使用還是單一事務(wù)性資源的使用,EJB都要求使用全局事務(wù)加以處理,這樣基于EJB的應(yīng)用就無法脫離應(yīng)用服務(wù)器的環(huán)境局部事務(wù)是基于單一事務(wù)性資源的,通常和底層的持久化技術(shù)有關(guān),例如,當(dāng)采用JDBC時,需要使用Connection對象來操作事務(wù),當(dāng)采用Hibernate持久化技術(shù)時,需要使用Session對象操作事務(wù)。當(dāng)使用局部事務(wù)時,應(yīng)用服務(wù)器不需要參與事務(wù)管理,因此不能保證跨多個事務(wù)性資源的事務(wù)的正確性,不過絕大部分應(yīng)用都是基于單一事務(wù)性資源的,只有很少的應(yīng)用需要使用多事務(wù)性資源的JTA事務(wù)-15-XML配置聲明式事務(wù)–數(shù)據(jù)源<!--數(shù)據(jù)源的配置--><beanid="dataSource"class="mons.dbcp.BasicDataSource“> <!--指定連接數(shù)據(jù)庫的驅(qū)動--> <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/> <!--指定連接數(shù)據(jù)庫的URL--> <propertyname="url"value="jdbc:mysql://localhost:3306/test"/> <!--指定連接數(shù)據(jù)庫的用戶名--> <propertyname="username"value="root"/> <!--指定連接數(shù)據(jù)庫的密碼--> <propertyname="password"value="root"/> <!--指定連接數(shù)據(jù)庫的連接池的初始化大小--> <propertyname="initialSize"value="5"/> <!--指定連接數(shù)據(jù)庫的連接池最大連接數(shù)--> <propertyname="maxActive"value="100"/> <!--指定連接數(shù)據(jù)庫的連接池最大空閑時間--> <propertyname="maxIdle"value="30"/> <!--指定連接數(shù)據(jù)庫的連接池最大等待時間--> <propertyname="maxWait"value="1000"/></bean>-16-XML配置聲明式事務(wù)–事務(wù)增強<!--事務(wù)管理器的配置--><beanid="txManager“class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <propertyname="dataSource"ref="dataSource"/></bean>
<!--事務(wù)增強配置--><tx:adviceid="txAdvice"transaction-manager="txManager"> <!--事務(wù)屬性定義--> <tx:attributes> <tx:methodname="get*"read-only="true"/> <tx:methodname="add*"rollback-for="Exception"/> <tx:methodname="update*"/> <tx:methodname="del*"/> </tx:attributes></tx:advice>-17-XML配置聲明式事務(wù)–事務(wù)切面<!--通過AOP配置事務(wù)增強切面--><aop:config> <aop:pointcutexpression="execution(*com..*.*Service.*(..))" id="allMethods"/> <aop:advisoradvice-ref="txAdvice"pointcut-ref="allMethods"/></aop:config><!--配置UserService類--><beanid="userService"class="co
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年焦炭采購與銷售合同
- 大班秋天語言教案分析
- 股權(quán)轉(zhuǎn)讓協(xié)議書模板集錦8篇
- 保健工作計劃模板集合八篇
- 初一年級上冊語文教學(xué)計劃
- 大學(xué)生畢業(yè)自我鑒定(15篇)
- 小學(xué)體育個人工作計劃
- 酒店前臺的實習(xí)報告范文十篇
- 做教師的心得體會
- 業(yè)務(wù)員半年工作總結(jié)15篇
- 輸配電工程施工方案
- 街道科普年終工作總結(jié)
- 高中數(shù)學(xué)教案全集10排列組合和概率
- 初中語文-《朝花夕拾》整本書閱讀教學(xué)設(shè)計學(xué)情分析教材分析課后反思
- 2021年9月時政題庫(附答案)
- 海天味業(yè)產(chǎn)品介紹
- GB/T 20200-2022α-烯基磺酸鈉
- 光伏電池組件跟蹤光源的PLC控制課件
- 圓周率1000000位-完整版
- 廣東某監(jiān)理公司檢測儀器設(shè)備管理規(guī)定
- 2023財務(wù)部年度工作總結(jié)(7篇)
評論
0/150
提交評論