摘要:越來越多的系統(tǒng)開始使用AOP(面向切面編程),面向切面編程越來越重要,但是AOP的連接點(diǎn)丟失問題一直未能很好的解決,該文針對使用Spring框架的系統(tǒng)中日志生成業(yè)務(wù)設(shè)計(jì)了一種連接點(diǎn)檢測器,可以遍歷所有連接點(diǎn),并在數(shù)據(jù)庫中維護(hù)連接點(diǎn)狀態(tài)。
關(guān)鍵詞:Spring;AOP;連接點(diǎn);面向切面編程;連接點(diǎn)丟失
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2013)09-2151-03
Spring中可以設(shè)定一種規(guī)范的方法名前綴來使該方法變成切入點(diǎn)實(shí)現(xiàn)切面業(yè)務(wù),例如日志,安全驗(yàn)證等。當(dāng)一個(gè)方法運(yùn)行時(shí)spring就會檢測該方法是否符合切入點(diǎn)特征,但是這種方法會出現(xiàn)很多人為的失誤或者錯(cuò)誤,假如我們不經(jīng)意的弄錯(cuò)了方法名或者某方法的名稱與該前綴相同,這個(gè)方法將不會被執(zhí)行切面的業(yè)務(wù)或者多余的執(zhí)行了切面業(yè)務(wù),所以我們設(shè)計(jì)了一種檢測器,將所有的連接點(diǎn)存入表中進(jìn)行維護(hù),來解決人為造成的連接點(diǎn)丟失或錯(cuò)配問題。
1 AOP簡介及Spring中基于AOP技術(shù)對日志的管理原理
1.1 AOP簡介
它利用一種稱為“橫切”的技術(shù),剖解開封裝的對象內(nèi)部,并將那些影響了多個(gè)類的公共行為封裝到一個(gè)可重用模塊,并將其名為“Aspect” ,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護(hù)性[1]。AOP代表的是一個(gè)橫向的關(guān)系,如果說“對象”是一個(gè)空心的圓柱體,其中封裝的是對象的屬性和行為;那么面向方面編程的方法,就仿佛一把利刃,將這些空心圓柱體剖開,以獲得其內(nèi)部的消息。而剖開的切面,也就是所謂的“方面”了。然后它又以巧奪天功的妙手將這些剖開的切面復(fù)原,不留痕跡。
圖1 AOP動態(tài)代理實(shí)現(xiàn)原理示意圖
上圖為用動態(tài)代理的方式實(shí)現(xiàn)AOP的示意圖,調(diào)用者捕捉到我們的連接點(diǎn),如圖中的原始對象,然后用代理封裝對象,代理中加入我們要對關(guān)注點(diǎn)實(shí)施的操作,如記錄,參數(shù)驗(yàn)證等。然后將結(jié)果返回給調(diào)用者,這就簡單的實(shí)現(xiàn)了一個(gè)AOP完整實(shí)現(xiàn)過程。
1.2 AOP里的重要概念
1)join point(連接點(diǎn)):是程序執(zhí)行中的一個(gè)精確執(zhí)行點(diǎn),例如類中的一個(gè)方法。它是一個(gè)抽象的概念,在實(shí)現(xiàn)AOP時(shí),并不需要去定義一個(gè)join point[2]。
2)point cut(切入點(diǎn)):本質(zhì)上是一個(gè)捕獲連接點(diǎn)的結(jié)構(gòu)。在AOP中,可以定義一個(gè)point cut[3],來捕獲相關(guān)方法的調(diào)用。
3)advice(通知):是point cut的執(zhí)行代碼,是執(zhí)行“方面”的具體邏輯[4]。
4)aspect(方面):point cut和advice結(jié)合起來就是aspect,它類似于OOP中定義的一個(gè)類,但它代表的更多是對象間橫向的關(guān)系[5]。
5)introduce(引入):為對象引入附加的方法或?qū)傩裕瑥亩_(dá)到修改對象結(jié)構(gòu)的目的。有的AOP工具又將其稱為mixin[6]。
上述的技術(shù)特性組成了基本的AOP技術(shù),大多數(shù)AOP工具均實(shí)現(xiàn)了這些技術(shù)。它們也可以是研究AOP技術(shù)的基本術(shù)語。
2.3 AOP技術(shù)的缺點(diǎn)分析
AOP技術(shù)產(chǎn)生的結(jié)構(gòu)沖突問題,我們可以利用反射機(jī)制來解決[7]。采用AOP技術(shù)將橫切代碼與基礎(chǔ)代碼分離,這樣雖然減少了代碼的冗余且方便代碼的管理,但是會產(chǎn)生一個(gè)結(jié)構(gòu)沖突的問題,如果程序被多次修改,aspect面的程序和連接點(diǎn)的連接可能被影響到。所以就出現(xiàn)了反射機(jī)制,如果利用反射機(jī)制,在AOP切面代碼編織進(jìn)入連接點(diǎn)時(shí),在這切面與連接點(diǎn)中間形成一個(gè)定義層,通過這個(gè)定義層來解決程序被修改而導(dǎo)致的結(jié)構(gòu)問題[8]。
AOP技術(shù)產(chǎn)生的連接點(diǎn)丟失和錯(cuò)誤配置問題,我自己開發(fā)設(shè)計(jì)了一種連接點(diǎn)統(tǒng)一管理的機(jī)制來解決這個(gè)問題。在基于AOP的系統(tǒng)設(shè)計(jì)中,連接點(diǎn)的定義一般會以一種規(guī)則形式[9],如果連接點(diǎn)因?yàn)槟承┤藶樵蚧蛘叱绦虻男薷?,?dǎo)致某些連接點(diǎn)丟失,或者錯(cuò)誤匹配到了不同的aspect切面上,就導(dǎo)致了連接點(diǎn)丟失錯(cuò)配問題[10]。如果我們把所有的連接點(diǎn)進(jìn)行統(tǒng)一的存儲管理,每次系統(tǒng)程序修改后,我們利用這個(gè)連接點(diǎn)管理機(jī)制對連接點(diǎn)進(jìn)行統(tǒng)一檢測,然后發(fā)現(xiàn)其中的問題,我們就可以發(fā)現(xiàn)并解決出現(xiàn)錯(cuò)誤的問題,把有問題或者有可能出現(xiàn)問題的連接點(diǎn)導(dǎo)出一個(gè)連接點(diǎn)報(bào)告,這樣我們就可以直觀有效的發(fā)現(xiàn)出現(xiàn)的問題,從而解決連接點(diǎn)丟失和連接點(diǎn)錯(cuò)配的問題。
2.4 連接點(diǎn)管理機(jī)制的提出
在一個(gè)基于AOP的系統(tǒng)中,會有非常多的連接點(diǎn),這些連接點(diǎn)都是我們進(jìn)行定義的,但是在定義的時(shí)候,可能會出現(xiàn)一些人為的失誤或者程序修改造成的連接點(diǎn)出現(xiàn)問題,所以我們提出了連接點(diǎn)管理機(jī)制。
連接點(diǎn)的管理機(jī)制主要思想就是把程序中所有定義過的連接點(diǎn)進(jìn)行統(tǒng)計(jì)存儲,當(dāng)我們程序修改后,啟動這個(gè)連接點(diǎn)管理機(jī)制,我們就可以通過我們存儲的信息,與程序修改后更新的連接點(diǎn)信息進(jìn)行比較,得出有問題的連接點(diǎn)。
比如在Spring框架中,可以設(shè)定一種規(guī)范的方法名前綴來使該方法變成切入點(diǎn)實(shí)現(xiàn)切面業(yè)務(wù)[11],我們針對這個(gè)原理,通過一種方式,將一個(gè)包內(nèi)所有的類中,所有符合的方法進(jìn)行收集整理,存入數(shù)據(jù)庫中,對他們的狀態(tài)進(jìn)行維護(hù),每次檢測都會得出連接點(diǎn)的丟失與改動的詳細(xì)記錄。通過這種方式來推斷連接點(diǎn)的安全與否。
3 基于AOP的連接點(diǎn)檢測器的實(shí)現(xiàn)
3.1 基于AOP的連接點(diǎn)檢測器的原理
在Spring框架中,可以設(shè)定一種規(guī)范的方法名前綴來使該方法變成切入點(diǎn)實(shí)現(xiàn)切面業(yè)務(wù),我們針對這個(gè)原理,通過一種方式,將一個(gè)包內(nèi)所有的類中,所有符合的方法進(jìn)行收集整理,存入數(shù)據(jù)庫中,對他們的狀態(tài)進(jìn)行維護(hù),每次檢測都會得出連接點(diǎn)的丟失與改動的詳細(xì)記錄。通過這種方式來推斷連接點(diǎn)的安全與否。
3.2 數(shù)據(jù)庫的設(shè)計(jì)
在整個(gè)檢測器的設(shè)計(jì)中,數(shù)據(jù)庫是非常重要的一個(gè)環(huán)節(jié),我們要將所有的方法存入到數(shù)據(jù)庫中進(jìn)行維護(hù),通過數(shù)據(jù)庫的方式,可以直觀快速的找到問題的所在。
數(shù)據(jù)庫的重要字段:UID,methodName,methodClass,methodPackage,state。UID是方法的唯一標(biāo)識,methodName,methodClass,methodPackage表示出方法的名字,來自于哪個(gè)類,哪個(gè)包,可以唯一確定一個(gè)方法。State是方法的狀態(tài),表示出這個(gè)方法是否為丟失連接點(diǎn)或者是新加入的連接點(diǎn)。
3.3 具體的實(shí)現(xiàn)方法
檢測器的輸入為包名和在Spring中設(shè)置的方法名的正則式,如*add。輸出為變動的方法名及變動原因。
1)首先在Spring的日志程序段中加入對所捕捉到的切入點(diǎn)方法名的檢測程序,如果此方法沒有在數(shù)據(jù)庫中,則將此方法存入數(shù)據(jù)庫,如果已經(jīng)存在數(shù)據(jù)庫中的話,則不進(jìn)行任何操作。
2)輸入包名及正則式,遍歷整個(gè)包,將所有的類找出存入LIST。輸入以包名為單位,遍歷整個(gè)包中的所有類,存入一個(gè)LIST。
3)遍歷所有類中,符合正則式的方法存入CLASSLIST。通過LIST,挨個(gè)將類取出進(jìn)行遍歷,通過Field[] fields =a.class.getFields(); Method[] methods=a.getMethods();這兩個(gè)方法把類中的所有方法存入一個(gè)LIST中,然后通過輸入的正則式篩選出符合條件的方法,將他們存入的MethodList中。
4)查詢表中數(shù)據(jù),如果是第一次運(yùn)行則將MethodList所有方法插入表中,如果不是第一次運(yùn)行則與MethodList對照。
3.4連接點(diǎn)管理機(jī)制算法
步驟 1遍歷所有連接點(diǎn).得到LIST1
步驟 2查詢joinpoint表得到 連接點(diǎn)LIST2
步驟 3比較LIST1 LIST2的長度
步驟 4如果LENGTH 1 = LENGTH 2 那么比較LIST1 和 LIST2中的連接點(diǎn)是否一致
步驟 5如果LENGTH 1 != LENGTH 2 且 LENGTH1 < LENGTH2那么查找丟失的連接點(diǎn)
步驟 6如果LENGTH1 != LENGTH 2 且 LENGTH1>LENGTH2 查找LIST1中多出的連接點(diǎn)
步驟 7導(dǎo)出結(jié)果,得到連接點(diǎn)的改動。
4 結(jié)束語
本文的設(shè)計(jì)的檢測器,針對Spring框架,利用此檢測器可以有效的避免連接點(diǎn)丟失,連接點(diǎn)錯(cuò)配的問題,因?yàn)橛袛?shù)據(jù)庫對所有符合的方法進(jìn)行維護(hù)管理,可以直觀而且快速的檢測到問題的所在。但是由于使用到了數(shù)據(jù)庫,而且要遍歷整個(gè)工程包,所以工作量會比較大,如果工程太大的話,檢測的效率會是個(gè)問題。
參考文獻(xiàn):
[1] Hameed K, Williams R,Smith J.Aspect Oriented Software Fault Tolerance[C].Proceedings of 4th Interna-tional Conference on Computer Science & Education (WCE09), London, 2009(1):1-3.
[2] Breivold H P,Crnkovic I.A systematic review of software archi-tecture evolution research[C]. Information and Software Technology,2012:16-40.
[3] Banani R,Graham N.Methods for evaluating software architec-ture:a survey[R]. Technical Report 2008-545 Queens University,2008 : 1-82.
[4] YE Peng,NI You-cong,HU Ming.Research on measurement tech-nique for evaluating adaptability of aspect-oriented software architec-ture[M]. Advanced Materials Research,2011, 268-270: 1307-1312.
[5] Garcia-magarino I,Cossentino M,Seidita V.A metricssuite for evaluating agent-oriented architectures[C]. Proc of the 25thACM Symposium on Applied Computing , 2010: 912-919.
[6] SANTANNA C,GAMEZ N,GARCIA A,et al.General architectureevaluation process/metrics,AOSD-Europe Deliverable D85[Z].2007.
[7] Jones M,Hamlen K W.Disambiguating Aspect-Oriented Security Poli-cies[C]. Proceedingsof of the 9th International Confidence on Aspect-Oriented Software Development(AOSD10) . 2010 .
[8] Clement A,Colyer A,Harley G,et al.Using eclipse aspect:your first steps[EB/OL]. http://www.informit.com/articles/article.aspx?p=357692.
[9] Liliana Dobrica,Eila Niemela.A survey on software architecture analysis methods[M]. IEEE Transactions on Software Engineering,2002 .
[10] Joseph D. Gradecki,Nicholas Lesiecki.Mastering Aspect: Aspect-Oriented Programming in Java[Z]. 2005
[11] SantAnna C,Lobato C,Kulesza U,et al. On the quantitative assessment of modular multi-agent system architectures [C].Proc of International Conference on Multiagent Systems and Software Architecture. London: Springer-Verlag,2006: 111-135.