摘要:在傳統(tǒng)的編程方法中對(duì)非核心業(yè)務(wù)的處理往往產(chǎn)生了大量的冗余代碼,該文利用AOP的動(dòng)態(tài)橫切技術(shù)解決這一問(wèn)題。將那些影響了多個(gè)核心業(yè)務(wù)的公共行為封裝到一個(gè)可重用模塊,并將其名為“Aspect”,實(shí)現(xiàn)代碼向模塊化方向發(fā)展,進(jìn)而降低耦合,達(dá)到軟件開發(fā)維護(hù)簡(jiǎn)易化。
關(guān)鍵詞:AOP;動(dòng)態(tài)橫切;權(quán)限管理
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)14-3813-02
AOP Dynamic Transversely Technology Apply to Commercial Bank's Payment System
LI Jian-min
(Guangdong Police Vocational College, Guagzhou 510520, China)
Abstract: In traditional programme method,there are a mass of redundancy code of dealing with no-core operation. Useing AOP's dynamic transversely technology resolve this problem in this paper. Those commonality actions of affecting multi-core operation encapsulate in module, this module is using by using, named \"Aspece\".The code is developing for modularize direction, therefore reducing coupling, reaching maintenance facilitation in software exploitation.
Key words: AOP; dynamic transversely; purview manage
1 AOP簡(jiǎn)介
AOP(Aspect-Oriented Programming,面向方面編程),這種技術(shù)可以說(shuō)是OOP(Object-Oriented Programing,面向?qū)ο缶幊?的補(bǔ)充和完善。OOP引入封裝、繼承和多態(tài)性等概念來(lái)建立一種對(duì)象層次結(jié)構(gòu),用以模擬公共行為的一個(gè)集合。當(dāng)我們需要為分散的對(duì)象引入公共行為的時(shí)候,OOP則解決不了這個(gè)難題。也就是說(shuō),OOP允許你定義從上到下的關(guān)系,但并不適合定義從左到右的關(guān)系。例如日志功能。日志代碼往往水平地散布在所有對(duì)象層次中,而與它所散布到的對(duì)象的核心功能毫無(wú)關(guān)系。對(duì)于其他類型的代碼,如安全性、異常處理和透明的持續(xù)性也是如此。這種散布在各處的無(wú)關(guān)的代碼被稱為橫切(cross-cutting)代碼,在OOP設(shè)計(jì)中,這種導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。
AOP技術(shù)作為一種完善,利用一種“橫切”的技術(shù),剖開封裝的對(duì)象內(nèi)部,將那些影響了多個(gè)類的公共行為封裝到一個(gè)可重用模塊,并將其名為“Aspect”,即方面。所謂“方面”,簡(jiǎn)單地說(shuō),就是將那些與業(yè)務(wù)無(wú)關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來(lái),便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來(lái)的可操作性和可維護(hù)性。AOP代表的是一個(gè)橫向的關(guān)系,如果說(shuō)“對(duì)象”是一個(gè)空心的圓柱體,其中封裝的是對(duì)象的屬性和行為;那么面向方面編程的方法,就仿佛一把利刃,將這些空心圓柱體剖開,以獲得其內(nèi)部的消息。而剖開的切面,也就是所謂的“方面”了。然后它又巧妙地將這些剖開的切面恢復(fù)原狀。AOP的這種特性提高了開發(fā)效率,使變化造成的影響局部化,代碼向模塊化方向發(fā)展,進(jìn)而降低耦合,達(dá)到軟件開發(fā)維護(hù)簡(jiǎn)易化,軟件迭代簡(jiǎn)化的目標(biāo)。
可以這樣說(shuō)一個(gè)關(guān)注點(diǎn)就是一個(gè)為了滿足系統(tǒng)整體目標(biāo)而必須被處理的特定需求,軟件系統(tǒng)可被看成一組關(guān)注點(diǎn)的實(shí)現(xiàn),關(guān)注點(diǎn)被分為兩種類型:核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)。核心關(guān)注點(diǎn)用來(lái)捕捉模塊的中心功能,而橫切關(guān)注點(diǎn)用來(lái)捕捉橫跨多個(gè)模塊的系統(tǒng)級(jí)外圍需求。常見的橫切關(guān)注點(diǎn)有:用戶認(rèn)證、記錄日志、資源池、系統(tǒng)管理、安全保密等。利用典型的OOP方法來(lái)實(shí)現(xiàn)系統(tǒng)造成核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)之間的耦合很不理想,如果要增加新的橫切特性,或者修改現(xiàn)有的橫切功能,都需要對(duì)相關(guān)的所有核心模塊進(jìn)行修改。因此引人了AOP是專門處理橫切關(guān)注點(diǎn)的,它提供了一種新的能夠橫切其他模塊的模塊化單位aspect(方面),實(shí)現(xiàn)分隔橫切關(guān)注點(diǎn)的目的在AOP方法中,橫切關(guān)注點(diǎn)在aspect中實(shí)現(xiàn)而不是把這些橫切關(guān)注點(diǎn)融合到核心模塊中去。AOP還提供了一個(gè)類似于編譯器的實(shí)體aspect(方面編織器),通過(guò)weavnig(織人)過(guò)程把核心模塊和橫切模塊合并到一起,從而構(gòu)造出最終的實(shí)際系統(tǒng)。這樣,AOP就用一種邊界清晰的方式把橫切關(guān)注點(diǎn)模塊化,產(chǎn)生出一個(gè)更容易設(shè)計(jì),實(shí)現(xiàn)和維護(hù)的系統(tǒng)架構(gòu),AOP的語(yǔ)言的實(shí)現(xiàn)如圖1。
例如:考慮傳統(tǒng)的開發(fā)過(guò)程中如果要引入一個(gè)日志模塊,需需要很多模塊的源代碼,在其中加入日志功能的實(shí)現(xiàn)函數(shù)。如果是在系統(tǒng)開發(fā)后期才引入這個(gè)模塊,那么則需要修改很多代碼,從而難免出現(xiàn)遺漏和錯(cuò)誤。AOP的引入使得程序員只需在軟件系統(tǒng)中聲明一個(gè)Aspect來(lái)關(guān)注需要進(jìn)行日志的地方,并且在這個(gè)Aspect中定義好其具體實(shí)現(xiàn)代碼。由AOP體系結(jié)構(gòu)或AOP語(yǔ)言保證這些橫切關(guān)注的實(shí)現(xiàn)。其他模塊中保持原來(lái)的代碼。這樣一來(lái)軟件的模塊化程度大大提高,而且程序邏輯的變更也變得非常靈活。
2 AOP動(dòng)態(tài)橫切技術(shù)
AOP的動(dòng)態(tài)橫切技術(shù)是利用截取消息的方式,對(duì)該消息進(jìn)行修改,以取代原有對(duì)象行為的執(zhí)行。動(dòng)態(tài)橫切是通過(guò)切入點(diǎn)和連接點(diǎn)在一個(gè)方面中創(chuàng)建行為的過(guò)程,連接點(diǎn)可以在執(zhí)行時(shí)橫向地應(yīng)用于現(xiàn)有對(duì)象。動(dòng)態(tài)橫切通常用于幫助向?qū)ο髮哟沃械母鞣N方法添加日志記錄或身份認(rèn)證。也可能理解為是引入了一套類似事件觸發(fā)機(jī)制。在很多應(yīng)用過(guò)程中,動(dòng)態(tài)橫切技術(shù)基本上代表了AOP。
動(dòng)態(tài)橫切技術(shù)的核心主要包括join point(連接點(diǎn)),point cut(切入點(diǎn)),advice(通知)和aspect。
1) join point(連接點(diǎn)):是程序執(zhí)行中的一個(gè)精確執(zhí)行點(diǎn),函數(shù)調(diào)用、函數(shù)執(zhí)行、變量賦值等都可是執(zhí)行點(diǎn),例如PriceManager類中的一個(gè)方法setPrice就是一個(gè)連接點(diǎn)。它是一個(gè)抽象的概念,在實(shí)現(xiàn)AOP時(shí),并不需要去定義一個(gè)join point;它是一個(gè)隱性的概念,是供Point cut來(lái)提取的點(diǎn)。
2) point cut(切入點(diǎn)):本質(zhì)上是一個(gè)捕獲連接點(diǎn)的結(jié)構(gòu)。在AOP中,可以定義一個(gè)point cut,來(lái)捕獲相關(guān)方法的調(diào)用。
3) advice(通知):是point cut的執(zhí)行代碼,是執(zhí)行“方面”的具體邏輯。
4) aspect(方面):point cut和advice結(jié)合起來(lái)就是aspect,它類似于OOP中定義的一個(gè)類,但它代表的更多是對(duì)象間橫向的關(guān)系。
多個(gè)訪問(wèn)類同時(shí)訪問(wèn)一個(gè)共享數(shù)據(jù)對(duì)象時(shí),每個(gè)訪問(wèn)類在訪問(wèn)這個(gè)數(shù)據(jù)對(duì)象時(shí),需要將數(shù)據(jù)對(duì)象上鎖,訪問(wèn)完成后,再實(shí)行解鎖,供其它并發(fā)線程訪問(wèn),這是我們處理并發(fā)訪問(wèn)資源的方式。為了實(shí)現(xiàn)這個(gè)需求,先實(shí)現(xiàn)傳統(tǒng)的編程,這里我們假定有一個(gè)寫鎖,對(duì)數(shù)據(jù)對(duì)象實(shí)行寫之前,首先對(duì)這個(gè)對(duì)象進(jìn)行上寫鎖,寫操作完畢后,必須釋放寫鎖。傳統(tǒng)編程鎖的實(shí)現(xiàn)方式是在每個(gè)具體類中實(shí)現(xiàn),這種實(shí)現(xiàn)方式有很多重復(fù)的編碼,如果稍微不小心,上鎖解鎖次序搞錯(cuò),系統(tǒng)就隱含大的BUG,這種可能性會(huì)隨著這個(gè)數(shù)據(jù)對(duì)象永遠(yuǎn)存在下去,后患無(wú)窮。
用AOP概念來(lái)重新實(shí)現(xiàn)上述需求,只是換了觀察問(wèn)題的一個(gè)新視角度。AOP是從縱向方面來(lái)解決上述問(wèn)題,advice - 真正的執(zhí)行代碼,或者說(shuō)關(guān)注的實(shí)現(xiàn)。 類似Action。join point - 代碼中激活advice被執(zhí)行的觸發(fā)點(diǎn)。這樣一來(lái),Worker中就不用再考慮關(guān)于“鎖”的問(wèn)題,只關(guān)心數(shù)據(jù)操作的主要方法就可以了。下面是用傳統(tǒng)方法和AOP方法解決這個(gè)問(wèn)題的圖解。
3 動(dòng)態(tài)橫切技術(shù)在商業(yè)銀行支付系統(tǒng)中的應(yīng)用
商業(yè)銀行支付系統(tǒng)采取client_server結(jié)構(gòu),其中,服務(wù)器端是系統(tǒng)的核心,它的作用是:為直連方式的商業(yè)銀行提供支付系統(tǒng)與商業(yè)銀行行內(nèi)系統(tǒng)接口的API,作為支付業(yè)務(wù)發(fā)送和接收的通道;為間連方式的商業(yè)銀行提供支付業(yè)務(wù)的服務(wù)平臺(tái),由客戶端發(fā)起接收支付業(yè)務(wù)。為保證前置系統(tǒng)穩(wěn)定可靠運(yùn)行,MBFE服務(wù)器配置建議為雙機(jī)熱備模式。此外,MBFE系統(tǒng)還包括:密押子系統(tǒng)(密押卡或密押服務(wù)器)、客戶端、網(wǎng)絡(luò)系統(tǒng)等。
系統(tǒng)對(duì)城市商業(yè)銀行行內(nèi)系統(tǒng)的業(yè)務(wù)員、業(yè)務(wù)主管和系統(tǒng)管理員等不同操作人員進(jìn)行權(quán)限管理,操作人員進(jìn)入系統(tǒng),必須輸入口令,口令與用戶名相符才能進(jìn)入。操作人員進(jìn)入系統(tǒng)后,只能訪問(wèn)經(jīng)過(guò)授權(quán)的功能。前置機(jī)端的用戶管理實(shí)行雙簽制。系統(tǒng)管理員增設(shè)用戶,業(yè)務(wù)經(jīng)理對(duì)該用戶進(jìn)行生效處理,互相牽制,新用戶才可登錄系統(tǒng)。如用戶密碼遺失,系統(tǒng)管理員有權(quán)對(duì)該用戶密碼作修改,經(jīng)業(yè)務(wù)經(jīng)理確認(rèn)后,登錄系統(tǒng)。
商業(yè)銀行系統(tǒng)發(fā)起大額實(shí)時(shí)支付業(yè)務(wù)、小額批量支付業(yè)務(wù)、撤銷業(yè)務(wù)、支付業(yè)務(wù)狀態(tài)查詢以及日終支付業(yè)務(wù)明細(xì)數(shù)據(jù)下載請(qǐng)求,商業(yè)銀行系統(tǒng)接收大額實(shí)時(shí)支付業(yè)務(wù)、小額批量支付業(yè)務(wù)、即時(shí)轉(zhuǎn)賬通知、日間透支計(jì)息、支付業(yè)務(wù)收費(fèi)清單、銀行匯票兌付通知、退回申請(qǐng)業(yè)務(wù)、退回申請(qǐng)應(yīng)答業(yè)務(wù)、查詢業(yè)務(wù)、查復(fù)業(yè)務(wù)、自由格式報(bào)文、系統(tǒng)狀態(tài)變換、匯總對(duì)賬通知、支付業(yè)務(wù)明細(xì)數(shù)據(jù)等,這些業(yè)務(wù)都與權(quán)限管理是分不開的。
比如在大額實(shí)時(shí)支付業(yè)務(wù)時(shí),采用傳統(tǒng)的設(shè)計(jì)方法,其代碼如下:
public class paycash
{ private ArrayList m_paycashs;
public paycashr ()
{ m_paycashs = new ArrayList();
}
public void Addpaycash(Order1 order2)
{ if (permissions.Verify(Permission.ADMIN))
{ m_paycash.Add(order1);
} }
public void Removepaycash(Order1 order1)
{ if (permissions.Verify(Permission.ADMIN))
{ m_Orders.Remove(order1);
}}}
同樣的,在支付系統(tǒng)中,還需要小額批量支付業(yè)務(wù),它采用了同樣的授權(quán)機(jī)制:
public class paylittlebatch
{ private ArrayList m_ paylittlebatchs;
public paylittlebatch ()
{ m_ paylittlebatchs = new ArrayList();
}
public void Addpaylittlebatch (Order2 order2)
{ if (permissions.Verify(Permission.ADMIN))
{ m_ paylittlebatchs.Add(order2);
} }
public void RemoveProduct(Order2 order2)
{ if (permissions.Verify(Permission.ADMIN))
{ m_paylittlebatchs.Remove(order2);
} } }
如此以來(lái),在整個(gè)支付系統(tǒng)中,核心業(yè)務(wù)包括大額實(shí)時(shí)支付業(yè)務(wù)、小額批量支付業(yè)務(wù)、為支付服務(wù)的清算賬戶信息和管理信息,它們都需要相同的權(quán)限管理。
毫無(wú)疑問(wèn),利用AOP技術(shù),我們可以分離出系統(tǒng)的核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn),從橫向的角度,截取業(yè)務(wù)管理行為的內(nèi)部消息,以達(dá)到織入權(quán)限管理邏輯的目的。當(dāng)執(zhí)行Add()等方法時(shí),系統(tǒng)將驗(yàn)證用戶的權(quán)限,調(diào)用橫切關(guān)注點(diǎn)邏輯,因此該方法即為AOP的join point。對(duì)于系統(tǒng)而言,每個(gè)需要權(quán)限驗(yàn)證的方法都是一個(gè)單獨(dú)的join point。由于權(quán)限驗(yàn)證將在每個(gè)方法執(zhí)行前執(zhí)行,所以對(duì)于這一系列join point,只需要定義一個(gè)point cut。當(dāng)系統(tǒng)執(zhí)行到j(luò)oin point處時(shí),將根據(jù)定義去查找對(duì)應(yīng)的point cut,然后執(zhí)行這個(gè)橫切關(guān)注點(diǎn)需要實(shí)現(xiàn)的邏輯,即advice。而point cut和advice,就組合成了一個(gè)權(quán)限管理aspect。
由于aspect是一個(gè)封裝的對(duì)象,我們可以定義這樣一個(gè)aspect:
private static aspect AuthorizationAspect{……}
然后在這個(gè)aspect中定義point cut,在point cut中,定義了需要截取上下文消息的方法,例如:
private pointcut authorizationExecution():
execution(public void paycash. Addpaycash (Order1)) ||
execution(public void paycash. Removepaycash (Order1)) ||
execution(public void paylittlebatch. Addpaylittlebatch (order2) ||
execution(public void paylittlebatch. Removepaylittlebatch (order2);
由于權(quán)限驗(yàn)證是在支付方法執(zhí)行之前完成,因此在before advice中,定義權(quán)限檢查:
before(): authorizationExecution()
{ if !(permissions.Verify(Permission.ADMIN))
{ throw new UnauthorizedException();
} }
通過(guò)定義了這樣一個(gè)完整的aspect,當(dāng)系統(tǒng)調(diào)用paycash或paylittlebatch的相關(guān)方法時(shí),就觸發(fā)了point cut,然后調(diào)用相應(yīng)的advice邏輯。如此以來(lái),paycash r和paylittlebatchr模塊就與權(quán)限管理模塊完全解除了依賴關(guān)系,同時(shí)也消除了傳統(tǒng)設(shè)計(jì)中不可避免的權(quán)限判斷的重復(fù)代碼。這對(duì)于建立一個(gè)松散耦合、可擴(kuò)展的系統(tǒng)軟件是非常有利的。
參考文獻(xiàn):
[1] 熊健,毛曉光.AOP技術(shù)在基于構(gòu)件軟件測(cè)試中的應(yīng)用[J].南京大學(xué)學(xué)報(bào):自然科學(xué),2005(1).
[2] 吳煒煜.面向?qū)ο蠓治鲈O(shè)計(jì)與編程(OOD/OOA/OOP/AOP[M].2版.北京:清華大學(xué)出版社,2007.