版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
-1-掌握AOP的基本概念及術(shù)語(yǔ)掌握各種Advice類(lèi)的編寫(xiě)方法了解切面的不同類(lèi)型掌握配置切面的方法了解Spring對(duì)事務(wù)管理的支持掌握編程式事務(wù)管理掌握聲明式事務(wù)的概念和配置方式目標(biāo)-2-AOPAOP(AspectOrientedProgramming)即“面向切面編程”AOP利用一種稱(chēng)為“橫切”的技術(shù),剖解開(kāi)封裝對(duì)象的內(nèi)部,并將那些影響了多個(gè)類(lèi)的行為封裝到一個(gè)可重用模塊中,并將其命名為“Aspect”,即切面(或稱(chēng)為方面)。通過(guò)切面可以將那些與業(yè)務(wù)無(wú)關(guān)卻為業(yè)務(wù)模塊共同調(diào)用的邏輯封裝起來(lái),從而減少了系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,有利于系統(tǒng)的可維護(hù)性和可擴(kuò)展性O(shè)OP提高了代碼的重用,而AOP將分散在各個(gè)業(yè)務(wù)邏輯中的相同代碼,通過(guò)橫向切割的方式抽取成一個(gè)獨(dú)立的模塊,使得業(yè)務(wù)邏輯類(lèi)更加簡(jiǎn)潔明-3-AOP相關(guān)概念連接點(diǎn)(Joinpoint)切入點(diǎn)(Pointcut)增強(qiáng)(Advice)目標(biāo)對(duì)象(Target)引入(Introduction)織入(Weaving)代理(Proxy)切面(Aspect)在AOP編程過(guò)程中,需要開(kāi)發(fā)人員參與的有三個(gè)方面:定義普通業(yè)務(wù)類(lèi)定義切入點(diǎn),一個(gè)切入點(diǎn)可能橫切多個(gè)業(yè)務(wù)組件定義增強(qiáng),增強(qiáng)就是在AOP框架為普通業(yè)務(wù)組件織入的處理邏輯-4-SpringAOP增強(qiáng)類(lèi)型-1根據(jù)增強(qiáng)在目標(biāo)類(lèi)連接點(diǎn)的位置不同,Spring框架支持五種類(lèi)型的增強(qiáng):前置增強(qiáng)后置增強(qiáng)返回后增強(qiáng)拋出異常后增強(qiáng)環(huán)繞增強(qiáng)定義方式:基于XML配置文件的管理方式:使用Spring配置文件來(lái)定義切入點(diǎn)和增強(qiáng)基于Annotation的“零配置”方式:使用@Aspect、@Pointcut等注解來(lái)定義切入點(diǎn)和增強(qiáng)-5-SpringAOP增強(qiáng)類(lèi)型-2<aop:before…/>:配置Before增強(qiáng)處理<aop:after…/>:配置After增強(qiáng)處理<aop:after-returning…/>:配置AfterReturning增強(qiáng)處理<aop:after-throwing…/>:配置AfterThrowing增強(qiáng)處理<aop:around…/>:配置Aroud增強(qiáng)處理屬性名描述pointcut該屬性指定一個(gè)切入點(diǎn)表達(dá)式,Spring將在匹配該表達(dá)式的連接點(diǎn)時(shí)織入該增強(qiáng)pointcut-ref該屬性指定一個(gè)已經(jīng)存在的切入點(diǎn)名稱(chēng),通常pointcut和pointcut-ref兩個(gè)屬性只需使用其中之一method該屬性指定一個(gè)方法名,它對(duì)應(yīng)切面中所定義的增強(qiáng)邏輯方法throwing該屬性只對(duì)<after-throwing…/>元素有效,用于指定一個(gè)形參名,AfterThrowing增強(qiáng)處理方法可以通過(guò)該形參訪(fǎng)問(wèn)目標(biāo)方法所拋出的異常returning該屬性只對(duì)<after-returning…/>元素有效,用于指定一個(gè)形參名,AfterReturning增強(qiáng)處理方法可以通過(guò)該形參訪(fǎng)問(wèn)目標(biāo)方法的返回值-6-基于XML–配置切面屬性名描述id定義該切面的標(biāo)識(shí)名ref指定該屬性所引用的普通Bean作為切面Beanorder指定該切面Bean的優(yōu)先級(jí),order值越小,該切面對(duì)應(yīng)的優(yōu)先級(jí)越高publicclassAspectBean{ publicvoidcheckAuth(){System.out.println("權(quán)限檢查...");} publicvoidrelease(){System.out.println("最后釋放資源...");} publicvoidlog(Objectresult){ if(result==null) System.out.println("數(shù)據(jù)庫(kù)中無(wú)結(jié)果!"); else System.out.println("數(shù)據(jù)庫(kù)中有結(jié)果!"); } publicvoidprocessException(Throwableex){ System.out.println("異常信息為:"+ex.getMessage()); } publicvoidproceedInTrans(ProceedingJoinPointjoinpoint) throwsThrowable{ System.out.println("開(kāi)始事務(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"> <!--還沒(méi)有配置增強(qiáng)--> </aop:aspect> </aop:config> <!--配置日志切面--> <beanid="aspectBean" class="com.dh.ch08.aspect.AspectBean"/></beans>-7-基于XML–配置增強(qiáng)publicinterfaceUserService{ /** *模擬刪除操作 */ publicvoiddel(); /** *模擬添加操作 */ publicvoidadd(); /** *模擬更新操作 */ publicvoidupdate(); /** *模擬查詢(xún)操作 */ publicObjectselect();}publicclassUserServiceImplimplementsUserService{ publicvoiddel(){ System.out.println("刪除一個(gè)User對(duì)象"); } publicvoidadd(){ System.out.println("添加一個(gè)User對(duì)象"); } publicvoidupdate(){ System.out.println("更新一個(gè)User對(duì)象"); } publicObjectselect(){ System.out.println("模擬查詢(xún)了多個(gè)User對(duì)象"); returnnull; }}<aop:configproxy-target-class="true"> <aop:aspectid="adviceAspect"ref="aspectBean"> <!--配置Before增強(qiáng),以切面Bean中的checkAuth()方法作為增強(qiáng)處理方法--> <aop:beforemethod="checkAuth" pointcut="execution(*com..*.*Service.*(..))"/> <!--配置AfterReturning增強(qiáng),以切面中的log()方法作為增強(qiáng)處理方法--> <aop:after-returningmethod="log" pointcut="execution(*com..*.*Service.select(..))" returning="result"/> <!--配置AfterThrowing增強(qiáng),以切面中的processException方法作為增強(qiáng)處理方法--> <aop:after-throwingmethod="processException" pointcut="execution(*com..*.*Service.*(..))" throwing="ex"/> <!--配置Around增強(qiáng),以切面中的processTrans()方法作為增強(qiáng)處理方法--> <aop:aroundmethod="proceedInTrans" pointcut="execution(*com..*.*Service.*(..))"/> <!--配置After增強(qiáng),以切面Bean中的release()方法作為增強(qiáng)處理方法--> <aop:aftermethod="release" pointcut="execution(*com..*.*Service.*(..))"/> </aop:aspect></aop:config><!--配置日志切面--><beanid="aspectBean"class="com.dh.ch08.aspect.AspectBean"/><!--配置UserService類(lèi)--><beanid="userService"class="com.dh.ch08.service.UserServiceImpl"/>-8-基于XML–配置切入點(diǎn)<aop:configproxy-target-class="true">
<aop:pointcutid="mypointcut" expression="execution(*com..*.*Service.*(..))"/> <aop:aspectid="adviceAspect"ref="aspectBean"> <!--配置before增強(qiáng)--> <aop:beforemethod="checkAuth"
pointcut-ref="mypointcut"/> </aop:aspect></aop:config>-9-基于XML–切入點(diǎn)指示符名稱(chēng)描述execution用來(lái)匹配執(zhí)行方法的連接點(diǎn),它是SpringAOP中最主要的切入點(diǎn)指示符within限定匹配特定類(lèi)型的連接點(diǎn),當(dāng)使用SpringAOP的時(shí)候,只能匹配方法執(zhí)行的連接點(diǎn)this用于限定AOP代理必須是指定類(lèi)型的實(shí)例,用于匹配該對(duì)象的所有連接點(diǎn)。當(dāng)使用SpringAOP的時(shí)候,只能匹配方法執(zhí)行的連接點(diǎn)target用于限定目標(biāo)對(duì)象必須是指定類(lèi)型的實(shí)例,用于匹配該對(duì)象的所有連接點(diǎn)。當(dāng)使用SpringAOP的時(shí)候,只能匹配方法執(zhí)行的連接點(diǎn)args用于對(duì)連接點(diǎn)的參數(shù)類(lèi)型進(jìn)行限制,要求參數(shù)類(lèi)型是指定類(lèi)型的實(shí)例。當(dāng)使用SpringAOP的時(shí)候,只能匹配方法執(zhí)行的連接點(diǎn)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–組合切入點(diǎn)execution(*com.dh..*(..))&&args(com.dh.ch08.pojos.User)Spring支持使用3個(gè)邏輯運(yùn)算符來(lái)組合切入點(diǎn)表達(dá)式:&&:要求連接點(diǎn)同時(shí)匹配兩個(gè)切入點(diǎn)表達(dá)式||:只要求連接點(diǎn)匹配任意一個(gè)切入點(diǎn)表達(dá)式!:要求連接點(diǎn)不匹配指定切入點(diǎn)表達(dá)式-11-基于Annotation–配置切面<aop:aspectj-autoproxy/>AspectJ是一個(gè)基于Java語(yǔ)言的AOP框架,它擴(kuò)展了標(biāo)準(zhǔn)Java,從語(yǔ)言層面提供了強(qiáng)大的AOP功能。在配置文件中配置啟動(dòng)AspectJ@AspectpublicclassAspectBean{......省略其他內(nèi)容}-12-基于Annotation–配置增強(qiáng)AspectJ提供的幾個(gè)主要的增強(qiáng)注解:@Before前置增強(qiáng)@AfterReturning返回后增強(qiáng)@Around環(huán)繞增強(qiáng)@AfterThrowing拋出增強(qiáng)@After
后置增強(qiáng)@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ù)庫(kù)中無(wú)結(jié)果!"); else System.out.println("數(shù)據(jù)庫(kù)中有結(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("開(kāi)始事務(wù)..."); ceed(); System.out.println("提交事務(wù)..."); }}-13-基于Annotation–配置切入點(diǎn)@AspectpublicclassAspectBean{ /** *使用@Pointcut來(lái)配置切入點(diǎn) */ @Pointcut("execution(*com..*.*Service.*(..))") privatevoidcrud(){}; /** *模擬進(jìn)行權(quán)限檢查 */
@Before("crud()") publicvoidcheckAuth(){ System.out.println("權(quán)限檢查..."); }......省略}切入點(diǎn)可以通過(guò)@Pointcut進(jìn)行聲明。一個(gè)切入點(diǎn)的聲明有兩部分組成,一個(gè)是包含名字和任意參數(shù)的簽名,另一個(gè)是切入點(diǎn)表達(dá)式示例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又必須通過(guò)JNDI獲取,這就意味著無(wú)論用戶(hù)的應(yīng)用是跨多個(gè)事務(wù)性資源(如關(guān)系型數(shù)據(jù)庫(kù)和消息隊(duì)列等)的使用還是單一事務(wù)性資源的使用,EJB都要求使用全局事務(wù)加以處理,這樣基于EJB的應(yīng)用就無(wú)法脫離應(yīng)用服務(wù)器的環(huán)境局部事務(wù)是基于單一事務(wù)性資源的,通常和底層的持久化技術(shù)有關(guān),例如,當(dāng)采用JDBC時(shí),需要使用Connection對(duì)象來(lái)操作事務(wù),當(dāng)采用Hibernate持久化技術(shù)時(shí),需要使用Session對(duì)象操作事務(wù)。當(dāng)使用局部事務(wù)時(shí),應(yīng)用服務(wù)器不需要參與事務(wù)管理,因此不能保證跨多個(gè)事務(wù)性資源的事務(wù)的正確性,不過(guò)絕大部分應(yīng)用都是基于單一事務(wù)性資源的,只有很少的應(yīng)用需要使用多事務(wù)性資源的JTA事務(wù)-15-XML配置聲明式事務(wù)–數(shù)據(jù)源<!--數(shù)據(jù)源的配置--><beanid="dataSource"class="mons.dbcp.BasicDataSource“> <!--指定連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng)--> <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/> <!--指定連接數(shù)據(jù)庫(kù)的URL--> <propertyname="url"value="jdbc:mysql://localhost:3306/test"/> <!--指定連接數(shù)據(jù)庫(kù)的用戶(hù)名--> <propertyname="username"value="root"/> <!--指定連接數(shù)據(jù)庫(kù)的密碼--> <propertyname="password"value="root"/> <!--指定連接數(shù)據(jù)庫(kù)的連接池的初始化大小--> <propertyname="initialSize"value="5"/> <!--指定連接數(shù)據(jù)庫(kù)的連接池最大連接數(shù)--> <propertyname="maxActive"value="100"/> <!--指定連接數(shù)據(jù)庫(kù)的連接池最大空閑時(shí)間--> <propertyname="maxIdle"value="30"/> <!--指定連接數(shù)據(jù)庫(kù)的連接池最大等待時(shí)間--> <propertyname="maxWait"value="1000"/></bean>-16-XML配置聲明式事務(wù)–事務(wù)增強(qiáng)<!--事務(wù)管理器的配置--><beanid="txManager“class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <propertyname="dataSource"ref="dataSource"/></bean>
<!--事務(wù)增強(qiáng)配置--><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ù)切面<!--通過(guò)AOP配置事務(wù)增強(qiáng)切面--><aop:config> <aop:pointcutexpression="execution(*com..*.*Service.*(..))" id="allMethods"/> <aop:advisoradvice-ref="txAdvice"pointcut-ref="allMethods"/></aop:config><!--配置UserService類(lèi)--><beanid="userService"class="co
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026云南楊善洲干部學(xué)院招聘城鎮(zhèn)公益性崗位人員1人備考題庫(kù)參考答案詳解
- 廣東2025年廣東海洋大學(xué)招聘非教學(xué)崗合同制工作人員5人(第三批)筆試歷年參考題庫(kù)附帶答案詳解
- 宿州2025年安徽宿州碭山縣人民醫(yī)院招聘120隨車(chē)醫(yī)生筆試歷年參考題庫(kù)附帶答案詳解
- 2026東風(fēng)越野車(chē)有限公司招聘14人備考題庫(kù)(湖北)及參考答案詳解
- 咸陽(yáng)2025年陜西咸陽(yáng)市事業(yè)單位招聘碩士研究生52人筆試歷年參考題庫(kù)附帶答案詳解
- 2026四川西昌市人民醫(yī)院招聘8人備考題庫(kù)完整答案詳解
- 2026云南昭通市水富市文化館城鎮(zhèn)公益性崗位人員招聘1人備考題庫(kù)及參考答案詳解一套
- 2025山東省交通規(guī)劃設(shè)計(jì)院集團(tuán)有限公司下半年招聘6人備考題庫(kù)及一套完整答案詳解
- 2025福建泉州市豐澤區(qū)高新產(chǎn)業(yè)園區(qū)管理委員會(huì)招聘編外工作人員1人備考題庫(kù)及一套參考答案詳解
- 2026上半年貴州事業(yè)單位聯(lián)考人民檢察院招聘1人備考題庫(kù)及答案詳解(易錯(cuò)題)
- 大廈無(wú)償劃轉(zhuǎn)協(xié)議書(shū)
- 復(fù)墾施工合同協(xié)議
- 2024年四川省考公務(wù)員考試結(jié)構(gòu)化面試鄉(xiāng)鎮(zhèn)崗真題試題試卷答案解析
- 貿(mào)易公司組織架構(gòu)與部門(mén)職責(zé)一覽表
- 《電梯基本結(jié)構(gòu)》課件
- 供水管道緊急搶修工程合同
- DL∕T 1993-2019 電氣設(shè)備用六氟化硫氣體回收、再生及再利用技術(shù)規(guī)范
- (正式版)HGT 20593-2024 鋼制化工設(shè)備焊接與檢驗(yàn)工程技術(shù)規(guī)范
- 肘關(guān)節(jié)恐怖三聯(lián)征
- 刀模管理制度
- NB-T 47013.2-2015 承壓設(shè)備無(wú)損檢測(cè) 第2部分-射線(xiàn)檢測(cè)
評(píng)論
0/150
提交評(píng)論