SpringAOP框架實(shí)現(xiàn)的結(jié)構(gòu)分析_第1頁
SpringAOP框架實(shí)現(xiàn)的結(jié)構(gòu)分析_第2頁
SpringAOP框架實(shí)現(xiàn)的結(jié)構(gòu)分析_第3頁
SpringAOP框架實(shí)現(xiàn)的結(jié)構(gòu)分析_第4頁
SpringAOP框架實(shí)現(xiàn)的結(jié)構(gòu)分析_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、本文的目標(biāo):從實(shí)現(xiàn)的角度來認(rèn)識(shí)springaop框架。觀察的角度:從外部接口,內(nèi)部實(shí)現(xiàn),組成部分,執(zhí)行過程四個(gè)方面來認(rèn)識(shí)springaop框架。本文的風(fēng)格:首先列出aop的基本概念;其次介紹框架所涉及到的核心組件列表,組件之間的結(jié)構(gòu)關(guān)系圖;然后細(xì)化結(jié)構(gòu)圖中的部分;接下來是一個(gè)簡(jiǎn)單的sample;最后是后記部分。注:1. 本文的源代碼基于spring2.xo spring的源代碼也處于演變中,但對(duì)基礎(chǔ)代碼的影響并不大。2本文是對(duì)sprinq loc容器實(shí)現(xiàn)的結(jié)構(gòu)分析的姊妹帖。正文:spring aop框架涉及的基本概念介紹:關(guān)注點(diǎn)(concern): 一個(gè)關(guān)注點(diǎn)可以是一個(gè)特定的問題、概念、或是應(yīng)

2、用程序的興趣區(qū)間總而言之,應(yīng)用程序必須達(dá)到的一 個(gè)目標(biāo)。核心關(guān)注點(diǎn)(core concern):業(yè)務(wù)功能模塊,如:存款模塊,取款模塊,轉(zhuǎn)賬模塊等,橫切關(guān)注點(diǎn)(crosscutting concern):非功能性的、橫切性模塊,如:安全性管理,事務(wù)管理,性能監(jiān)控等。切面(aspect): 一個(gè)切面是對(duì)一個(gè)橫切關(guān)注點(diǎn)的模塊化,它將那些原本散落在各處的、用于實(shí)現(xiàn)這個(gè)橫切點(diǎn)的代碼歸整到一 處。連接點(diǎn)(join point):程序執(zhí)行過程中的一點(diǎn),如:字段訪問:讀、寫實(shí)例變量;方法調(diào)用:対方法(包括構(gòu)造方法)的調(diào)用;異常拋出:特定的異常被拋出。切入點(diǎn)(pointcut):-組連接點(diǎn)的總稱,用于指定某個(gè)通

3、知應(yīng)該在何時(shí)被調(diào)用。切入點(diǎn)常用正則表達(dá)式或別的通配符語法來描 述,有些aop實(shí)現(xiàn)技術(shù)還支持切入點(diǎn)的組合。通知(advice):在特定連接點(diǎn)執(zhí)行的動(dòng)作。很多aop框架都以攔截器(interceptor)的形式來表現(xiàn)通知-所謂攔截器是這樣的- 個(gè)對(duì)象:當(dāng)連接點(diǎn)被調(diào)用時(shí),它會(huì)收到一個(gè)回調(diào)消息?;镜耐ㄖ校呵爸猛ㄖ?beforeadvice):在連接點(diǎn)調(diào)用之前,首先調(diào)用通知;后置通知(afteradvice):在連接點(diǎn)調(diào)用之后,再調(diào)用通知,在aspectj中,后置通知乂分為三種:afterreturningadvice:在調(diào)用成功完成(沒有異常拋出)之后。afterthrowingadvice:在拋

4、出某種特定類型(或其子類型)的異常之后。afteradvice:在連接點(diǎn)的任何調(diào)用之后,不管調(diào)用是否拋出異常。壞繞通知(aroundadvice):這類通知可以完全控制執(zhí)行流程。除了完成本身的工作之外,它還需要負(fù)責(zé)主動(dòng)調(diào)用連接點(diǎn), 促使真實(shí)的操作發(fā)生(proceed)-這通常是通過調(diào)用某個(gè)特定的方法來完成的。引介(introduction):為一個(gè)現(xiàn)有的java類或接口添加方法或字段。這種技術(shù)可以用于實(shí)現(xiàn)java中的多繼承,或者給現(xiàn)有對(duì) 象模型附加新的apl混入繼(mixin inheritance): 一個(gè)“混入類”封裝了一組功能,這組功能可以被”混入“到現(xiàn)有的類當(dāng)中,并且無須使用傳統(tǒng)的 繼

5、承手段。在aop這里,混入是通過引介來實(shí)現(xiàn)的。在java語言中,可以通過混入來模擬多繼承??椚?weaving):將方而整合到完整的執(zhí)行流程(或完整的類,此時(shí)被織入的便是引介中)。攔截器(initerceptor):很多aop框架用它來實(shí)現(xiàn)字段和方法的攔截(interception)。隨之而來的就是在連接點(diǎn)(如方法攔截)處 掛接一條攔截器鏈(interceptorchain),鏈條上的每個(gè)攔截器通常會(huì)調(diào)用下一個(gè)攔截器。aop代理(aop proxy):即被通知(advise)的對(duì)象引用-也就是說,aop通知將在其上執(zhí)行的這樣一個(gè)對(duì)象引用。目標(biāo)対象(targetobject):位于攔截器鏈末端的

6、對(duì)象實(shí)例“這個(gè)概念只存在于那些使用了攔截機(jī)制的框架之屮。注:上述概念描述引自expert one-on-one j2ee development without ejb中第八章對(duì)aop概念描述部分,更多精彩 部分可以參閱本章的完整內(nèi)容。上述概念已被spring aop框架很好的實(shí)現(xiàn),相關(guān)組件:advisor 組件,advice 組件,pointcut 組件,advised 組件,aopproxy 組件,aopproxyfactory 組件,圖1是對(duì)通知、切入點(diǎn)、切面、aop代理之間依賴關(guān)系的全景圖。通知和切入點(diǎn)組成一個(gè)切面,切面信息與目標(biāo)對(duì)象信息被組織到advised屮,aopproxyfac

7、tory通過advised中保存的信息 生成 aopproxy對(duì)象,調(diào)用aopproxy.getproxy()方法即可獲得通知后的對(duì)象。這里要著重了解的是不同的通知子類型,不同的切入點(diǎn)子類型,對(duì)于不同的切入點(diǎn)子類型最重要的兩種子類型:靜態(tài)切入點(diǎn),動(dòng)態(tài)切入點(diǎn),靜態(tài)切入點(diǎn):根據(jù)部署階段的信息選擇増強(qiáng),女?dāng)r截特定類的所冇getter方法”;動(dòng)態(tài)切入點(diǎn):根據(jù)運(yùn)行時(shí)的信息選擇增強(qiáng),如“如果某方法的返回值為null,則將其納入某切入點(diǎn)”。0 <<inteffac*»m visor«intcrface»advice<<intetfdce»q &

8、lt;<inteif>ce»pointcut ad visoraaaaj、compos abiepointcutq abstrctexcepfsstbintcutq dmcmhcdmchepoircutg3畑烏& pmethodmnfammelhochatcher<<inte»face» melhochatcher;contiolflowpomtaitskmtwd/chtfg dn micmethodmdwg dcfaultpointcut/d visortchefmntcutfldworg dfimcmsthcdmchefcuta

9、iwor6 jdkregexpmefthodpointait¥n am ematchmethodpointaitad visornamtfimclimethockointcut圖2是對(duì)圖1中advisor與pointcut的實(shí)現(xiàn)細(xì)化,圖中類之間的關(guān)系直觀上有點(diǎn)亂,但細(xì)看下關(guān)系還是相當(dāng)清晰的, 以advisor結(jié)尾的是切面類型,以pointcut結(jié)尾的是切入點(diǎn)類型,advisor pointcut的復(fù)用關(guān)系分兩類:一類是組合復(fù)用,另一類是具體繼承復(fù)用,組合復(fù)用例子如:regexpmethodpointcutadvisor 與 abstractregexpmethodpointcut之間

10、的關(guān)系,namematchmethodpointcutadvisor 與 namematchmethodpointcut 之間的關(guān)系,具體繼承復(fù)用例子 如:staticmethodmatcherpointcutadvisor 與 staticmethodmatcherpointcut 之間的關(guān)系,dynamicmethodmatcherpointcutadvisor 與 dynamicmethodmatcherpointcut 之間的關(guān)系,圖3.o <<interface>>advisedfactorybean/g advisedsuppohq creasteacpr

11、oxycin advtse(£ippoit : void) : aopproxyo<<in(erface>>aopproxyfacto ryo <<interface>>aopproxyg proxyfactorybean-kjdkdynam icaopproxy<<interface>>invocationhandlerdefaultaopproxyfactory ciast eacpr ok(in advisedstppod : void) : aopproxy圖3是對(duì)圖1屮生成aopproxy對(duì)象的實(shí)現(xiàn)細(xì)化

12、,aopproxyfactory通過advisedsupport提供的信息生成aopproxy對(duì)象,aopproxy對(duì)象的生成分兩類方式:一類是動(dòng)態(tài)代 理,另一類是字節(jié)碼通知;需要注意的是,proxyfactory與proxyfactorybean并不是功能實(shí)現(xiàn)的必要部分,主要目的為編程式使用代理提供便利的apl下面是一個(gè)簡(jiǎn)單的sample:java代碼七1./目標(biāo)對(duì)彖接口 2.public interface target 3.public string play(int arg);4.5.冃標(biāo)對(duì)彖實(shí)現(xiàn).6.7public class targetlmpl implements target

13、 / 8.public string play(int arg) 9.system.outprintln("play method.10.return "target:h + arg;11.12.13-/前置通知14.public class mybeforeadvice implements methodbeforeadvice 15.public void before(method method, object args, object target)16.throws throwable 17.systemoutprintin(methodgetname();18.

14、sys tem. out print in (" befog met hod!");19.20.21.后置通知22.public class myafteradvice implements afterreturningadvice 23.public void afterreturning(object retutnvalue method method,24.object args object target) throws throwable 25.systemout.printin(returnvalue + h:after method”);26.27.28.切入

15、點(diǎn)實(shí)現(xiàn)29.30.public class mypointcut implements pointcut 31.32.public classfilter getclassfilter() 33.34return new classfilter() public boolean matches(class arg0) if (arg0 = targetimpl.class) return true;return false;public methodmatcher getmethodmatcher() return new methodmatcher() public boolean isru

16、ntime() return false;public boolean matches(method argo class argl) if ("playhequals(arg0.getname() return true;return false;public boolean matches(method arg0, class argl, object arg2) system.out.printing”);if ("play"equals(arg0getname() return true;return false;public class main pub

17、lic static void main(stning args) target target = new targetlmpl();/冃標(biāo)對(duì)象advice beforeadvice = new mybeforeadvice(); /通知pointcut pointcut = new mypointcut(); /切入點(diǎn)78.defaultpointcutadvisor dda = new defaultpointcutadvisor(); /切面dda.setadvice(beforeadvice);8.89 3.9

18、7 01.102.103.dda.setpointcut(pointcut);advisedsupport advisedsupport = new advisedsupport(); /捉供基本的編程方式, advisedsupport.addadvisor(dda);advisedsupportaddadvice(new myafteradvice();advisedsupportaddlnterface(target.class);advisedsupportsettarget(target);aopproxy aopproxy = new def

19、aultaopproxyfactony()createaopproxycadvisedsuppor"t);target proxy = (target)aopproxy.getproxy();system.out.printin(proxy.play(200);proxyfactory proxyfactory = new proxyfactory(); /提供便利的編程方式.proxyfactoryaddadvisor(dda);proxyfactoryaddlnterface(targetclass); proxyfactory.settarget(target);target

20、proxy2 = (target)proxyfactory.getproxy();system.out.println(proxy2.play(201);proxyfactorybean proxyfactorybean = new proxyfactorybean(); /提供便利的配置方式 proxyfactorybeanaddadvisor(dda);proxyfactorybean.addlnterface(target.class);proxyfactorybeansettarget(target);target proxy3 = (target)pnoxyfactorybean.getobject();system.out printin(proxy3.play(232);104. 注:此處為了簡(jiǎn)單忽略了一些概念描述:1 對(duì)引介,混入繼承沒有涉及。2. 對(duì)通知鏈的管理,如:同一切入點(diǎn)多個(gè)通知對(duì)象之間的執(zhí)行順序問題;3. 上述的描述是spring aop框架木身,所提供的使用方式是編程式,這種使用方式太過于低級(jí),以至于我們?cè)诰懦傻那闆r 下不會(huì)使用到,主流的使用方式是配置化的聲明式使用方式,將aop與loc結(jié)合起來使用才能發(fā)

溫馨提示

  • 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)論