版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
-1-掌握AOP的基本概念及術語掌握各種Advice類的編寫方法了解切面的不同類型掌握配置切面的方法了解Spring對事務管理的支持掌握編程式事務管理掌握聲明式事務的概念和配置方式目標-2-AOPAOP(AspectOrientedProgramming)即“面向切面編程”AOP利用一種稱為“橫切”的技術,剖解開封裝對象的內部,并將那些影響了多個類的行為封裝到一個可重用模塊中,并將其命名為“Aspect”,即切面(或稱為方面)。通過切面可以將那些與業(yè)務無關卻為業(yè)務模塊共同調用的邏輯封裝起來,從而減少了系統(tǒng)的重復代碼,降低模塊間的耦合度,有利于系統(tǒng)的可維護性和可擴展性OOP提高了代碼的重用,而AOP將分散在各個業(yè)務邏輯中的相同代碼,通過橫向切割的方式抽取成一個獨立的模塊,使得業(yè)務邏輯類更加簡潔明-3-AOP相關概念連接點(Joinpoint)切入點(Pointcut)增強(Advice)目標對象(Target)引入(Introduction)織入(Weaving)代理(Proxy)切面(Aspect)在AOP編程過程中,需要開發(fā)人員參與的有三個方面:定義普通業(yè)務類定義切入點,一個切入點可能橫切多個業(yè)務組件定義增強,增強就是在AOP框架為普通業(yè)務組件織入的處理邏輯-4-SpringAOP增強類型-1根據(jù)增強在目標類連接點的位置不同,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該屬性指定一個方法名,它對應切面中所定義的增強邏輯方法throwing該屬性只對<after-throwing…/>元素有效,用于指定一個形參名,AfterThrowing增強處理方法可以通過該形參訪問目標方法所拋出的異常returning該屬性只對<after-returning…/>元素有效,用于指定一個形參名,AfterReturning增強處理方法可以通過該形參訪問目標方法的返回值-6-基于XML–配置切面屬性名描述id定義該切面的標識名ref指定該屬性所引用的普通Bean作為切面Beanorder指定該切面Bean的優(yōu)先級,order值越小,該切面對應的優(yōu)先級越高publicclassAspectBean{ publicvoidcheckAuth(){System.out.println("權限檢查...");} publicvoidrelease(){System.out.println("最后釋放資源...");} publicvoidlog(Objectresult){ if(result==null) System.out.println("數(shù)據(jù)庫中無結果!"); else System.out.println("數(shù)據(jù)庫中有結果!"); } publicvoidprocessException(Throwableex){ System.out.println("異常信息為:"+ex.getMessage()); } publicvoidproceedInTrans(ProceedingJoinPointjoinpoint) throwsThrowable{ System.out.println("開始事務..."); ceed(); System.out.println("提交事務..."); }}<?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限定匹配特定類型的連接點,當使用SpringAOP的時候,只能匹配方法執(zhí)行的連接點this用于限定AOP代理必須是指定類型的實例,用于匹配該對象的所有連接點。當使用SpringAOP的時候,只能匹配方法執(zhí)行的連接點target用于限定目標對象必須是指定類型的實例,用于匹配該對象的所有連接點。當使用SpringAOP的時候,只能匹配方法執(zhí)行的連接點args用于對連接點的參數(shù)類型進行限制,要求參數(shù)類型是指定類型的實例。當使用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框架,它擴展了標準Java,從語言層面提供了強大的AOP功能。在配置文件中配置啟動AspectJ@AspectpublicclassAspectBean{......省略其他內容}-12-基于Annotation–配置增強AspectJ提供的幾個主要的增強注解:@Before前置增強@AfterReturning返回后增強@Around環(huán)繞增強@AfterThrowing拋出增強@After
后置增強@AspectpublicclassAspectBean{
@Before("execution(*com..*.*Service.*(..))") publicvoidcheckAuth(){System.out.println("權限檢查...");}
@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ù)庫中無結果!"); else System.out.println("數(shù)據(jù)庫中有結果!"); }
@AfterThrowing(pointcut="execution(*com..*.*Service.*(..))",throwing="ex") publicvoidprocessException(Throwableex){ System.out.println("異常信息為:"+ex.getMessage()); }
@Around("execution(*com..*.*Service.*(..))") publicvoidproceedInTrans(ProceedingJoinPointjoinpoint) throwsThrowable{ System.out.println("開始事務..."); ceed(); System.out.println("提交事務..."); }}-13-基于Annotation–配置切入點@AspectpublicclassAspectBean{ /** *使用@Pointcut來配置切入點 */ @Pointcut("execution(*com..*.*Service.*(..))") privatevoidcrud(){}; /** *模擬進行權限檢查 */
@Before("crud()") publicvoidcheckAuth(){ System.out.println("權限檢查..."); }......省略}切入點可以通過@Pointcut進行聲明。一個切入點的聲明有兩部分組成,一個是包含名字和任意參數(shù)的簽名,另一個是切入點表達式示例8.3-14-Spring事務策略JavaEE應用的事務策略有全局事務和局部事務兩種全局事務通常由應用服務器管理,需要底層應用服務器(例如WebLogic和WebSphere等)的JTA支持,EJB事務就是建立在JTA的基礎上,而JTA又必須通過JNDI獲取,這就意味著無論用戶的應用是跨多個事務性資源(如關系型數(shù)據(jù)庫和消息隊列等)的使用還是單一事務性資源的使用,EJB都要求使用全局事務加以處理,這樣基于EJB的應用就無法脫離應用服務器的環(huán)境局部事務是基于單一事務性資源的,通常和底層的持久化技術有關,例如,當采用JDBC時,需要使用Connection對象來操作事務,當采用Hibernate持久化技術時,需要使用Session對象操作事務。當使用局部事務時,應用服務器不需要參與事務管理,因此不能保證跨多個事務性資源的事務的正確性,不過絕大部分應用都是基于單一事務性資源的,只有很少的應用需要使用多事務性資源的JTA事務-15-XML配置聲明式事務–數(shù)據(jù)源<!--數(shù)據(jù)源的配置--><beanid="dataSource"class="mons.dbcp.BasicDataSource“> <!--指定連接數(shù)據(jù)庫的驅動--> <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配置聲明式事務–事務增強<!--事務管理器的配置--><beanid="txManager“class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <propertyname="dataSource"ref="dataSource"/></bean>
<!--事務增強配置--><tx:adviceid="txAdvice"transaction-manager="txManager"> <!--事務屬性定義--> <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配置聲明式事務–事務切面<!--通過AOP配置事務增強切面--><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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國安防電子行業(yè)市場供需趨勢發(fā)展戰(zhàn)略分析報告
- 2024年塔吊司機承包項目勞務合同3篇
- 2024-2030年中國太陽能發(fā)電系統(tǒng)設備商業(yè)計劃書
- 2024-2030年中國地面通信導航定向設備行業(yè)當前經(jīng)濟形勢及投資建議研究報告
- 茅臺學院《圖形圖像信息處理進階》2023-2024學年第一學期期末試卷
- 2024年權益保障:合同與財務制度
- 茅臺學院《電子測量原理》2023-2024學年第一學期期末試卷
- 馬鞍山師范高等??茖W?!吨型饣A教育比較》2023-2024學年第一學期期末試卷
- 2024年在線教育平臺軟件定制委托開發(fā)合同2篇
- 2024三輪汽車駕駛培訓學校合作經(jīng)營協(xié)議3篇
- 2024年低壓電工復審取證考試題庫附答案(通用版)
- 新管徑流速流量對照表
- 咯血病人做介入手術后的護理
- 境外投資環(huán)境分析報告
- 《壓力平衡式旋塞閥》課件
- 物聯(lián)網(wǎng)與人工智能技術融合發(fā)展年度報告
- 婦產(chǎn)科醫(yī)生醫(yī)患溝通技巧
- 內科學糖尿病教案
- 《高尿酸血癥》課件
- 微量泵的操作及報警處置課件查房
- 人教版小學數(shù)學四年級上冊5 1《平行與垂直》練習
評論
0/150
提交評論