Spring中的面向切面編程_第1頁
Spring中的面向切面編程_第2頁
Spring中的面向切面編程_第3頁
Spring中的面向切面編程_第4頁
Spring中的面向切面編程_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、 1 / 5 一.為什么要面向切面編程(Aspect Oriented Programming ),或者說為什么要用切面?想象這樣一個(gè)場景: 一個(gè)項(xiàng)目起初開發(fā)的時(shí)候沒有考慮日志功能,而是在最后想為每個(gè)業(yè)務(wù)方法加上記錄日志的功能。 如果遇到這樣的情況,是不是真的要重新編寫每一個(gè)業(yè)務(wù)方法,給它們加上日志功能呢?如果這樣還不能說明面向切面編程的必要性,那么在考慮一個(gè)場景: 一個(gè)項(xiàng)目由兩個(gè)項(xiàng)目組完成,A 組負(fù)責(zé)的是業(yè)務(wù)方法,B 組負(fù)責(zé)的是加一些日志、安全、事務(wù)、緩存等額外功能,B 組拿到的是A 組已經(jīng)編譯好了的類文件,這時(shí)再想修改源代碼很顯然是不顯示的了。而面向切面編程就可以解決這樣的問題。 面向切面

2、編程(簡稱AOP )的目標(biāo): 1.把橫切關(guān)注點(diǎn)從業(yè)務(wù)邏輯中分離,獨(dú)立模塊化 2.在不改變現(xiàn)有代碼的前提下,動(dòng)態(tài)的添加功能 二Spring 框架中如何使用AOP ? 方法一: Spring 經(jīng)典的AOP 實(shí)現(xiàn) 1.實(shí)現(xiàn)MethodInceptor接口,在其invoke()方法中定義行為(Advice ) 2.使用ProxyFactoryBean生成代理 <bean id=factoryBean class=org.springframework.aop.framework.ProxyFactoryBean> <property name=target ref=”目標(biāo)對(duì)象”>

3、;</property> <property name=interceptorNames> 2 / 5 <list>切面列表</list> </property> </bean> 方法二: 利用Spring 提供的自動(dòng)代理生成器 自動(dòng)代理生成器其實(shí)是在方法一的基礎(chǔ)上再次封裝,為我們提供了更強(qiáng)大的功能,同時(shí)操作也更方便。 特點(diǎn): 完全基于XML 配置;能夠使用AspectJ的切點(diǎn)表達(dá)式。 示例: 1.配置文件中添加aop命名空間,完整的根節(jié)點(diǎn)定義如下: <beans xmlns=http: xmlns: aop=htt

4、p: xmlns: xsi=http: xsi: schemaLocation=http: http: 3 / 5 </beans> 2.添加如下配置: <aop: config> <aop: pointcut id=pc expression=within(選擇要切的類)/> <aop: aspect ref=切面> <aop: beforepointcut-ref=pc method=切面中的方法/> </aop: aspect> </aop: config> 除了aop: before外,還有多種Advi

5、ce before 表示切面在切點(diǎn)之前; after-returning 表示切點(diǎn)方法執(zhí)行完畢成功返回后執(zhí)行切面方法; after-throwing 表示切點(diǎn)方法拋出異常時(shí)執(zhí)行切面方法; 4 / 5 after 表示無論切點(diǎn)方法是否成功返回,都執(zhí)行切面方法; around 表示切點(diǎn)方法執(zhí)行期間執(zhí)行切面方法,也就是自定義執(zhí)行順 序。 around 對(duì)方法有如下要求: 1,返回類型Object 2,參數(shù)ProceedingJoinPoint 3,throwsThrowable AspectJ切點(diǎn)表達(dá)式: within: 匹配類內(nèi)的所有方法(必須是實(shí)現(xiàn)類,不能是接口) 如: within(first

6、.Singer) execution: 匹配指定的方法 execution(void perform()匹配項(xiàng)目下所有該方法 execution(void first.Singer.perform()匹配具體到某個(gè)類的該方法 execution(* first.Artist.perform()不考慮返回值類型 execution(* first.Artist.perform(.)不考慮返回值類型和參數(shù)列表 execution(* first.Aritst.perform(*,*)參數(shù)必須是兩個(gè) execution(* first.Artist.perform(.,java.lang.Strin

7、g) execution(* find*(.)所有方法名符合findXxx的方法 5 / 5 條件運(yùn)算符: not and or within(first.service.StoreService) or execution(* first.dao.*.*(.) 三切面方法中如何獲得切點(diǎn)信息? around 對(duì)方法要求有參數(shù)ProceedingJoinPoint,所以可以很容易的獲得切點(diǎn)對(duì)象的相關(guān)信息。那么after, before 等其他的切面類型對(duì)方法沒有這樣的要求,該怎么獲得切點(diǎn)信息呢?對(duì)于這些方法,可以直接為其添加JoinPoint參數(shù),這樣就可以獲得 方法對(duì)象,參數(shù)列表,目標(biāo)對(duì)象,代理對(duì)象的信息。 返回值和異常則可以直接接受,然后在配置中添加屬性即可。例如: 方法簽名為: public void after(JoinPointjp, Object res, Exception e) 配置信息為: <aop: a

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論