面向方面編程(Aspect-OrientedProgramming,AOP)就是這樣一種區別于傳統編程技術的新的編程思想,最初由GregorKiczales在施樂的PaloAlto研究中心領導的一個研究小組于1997年提出。AOP正是基于方面與模塊形成橫切,造成代碼糾結這一觀察提出的,并提出了一種新的編程思路來解決這一問題。之后,AOP經由幾個不同小組的努力在各自的方向上得到了發展,到目前為止,AOP仍處于發展階段。
2.1AOP的基本思想
如前所述,造成代碼糾結的原因在于傳統編程技術中,軟件系統中非業務功能實現的代碼無法模塊化,散布在實現業務功能的代碼中造成的。這里,我們引入關注點(Concern)的概念,關注點就是軟件系統中需要解決的問題。軟件系統的業務功能組成了核心關注點(CoreConcerns),也就是軟件系統要解決的問題,而諸如日志記錄,事物處理等關注點就形成了橫切關注點(CrosscuttingConcerns),因為,這些關注點散布在核心關注點中,相互形成了橫切的關系,橫切關注點也就是前面提到的方面這一概念。
有鑒于此,AOP提出的解決方法是對這兩種相互橫切的關注點分別進行編碼,使用傳統的編程語言對核心關注點編程,使用面向方面的編程語言對橫切關注點,也就是方面進行編程。然后使用一種機制將這兩種代碼自動混合起來,形成最終的代碼。在這里,面向方面的編程語言可以是已有編程語言的擴展(AspectJ,AspectC++,AspectC,AspectC#,Apostle等),或是一種新的語言,設計用于編寫方面的代碼(Caesar,D2AL,JasCo等)。而將兩種代碼混合的機制稱為織入(Weaving),實現這一機制的工具稱為織入器(Weaver)。因此,對方面單獨編碼,并通過適當的織入機制使兩種代碼混合,構成了AOP解決代碼糾結問題的基石。
2.2織入機制
如前所述,織入是實現AOP的一個重要機制,織入的實現機制有多種,基本上可以分為兩類,靜態織入與動態織入。靜態織入是指在業務功能代碼中的適當位置,比如某段代碼執行前,或執行后,將方面中的編碼插入,從而形成混合的編碼。方面中的編碼在程序運行前,已被內聯至業務功能代碼中,因此,代碼可以被優化,從而使織入產生的開銷最小化,最終產生的混合代碼,其執行速度接近為使用AOP方式編寫的代碼。但是,靜態織入無法做到在程序運行時,根據運行上下文動態的決定插入的方面代碼,動態織入則可以做到這一點。動態織入可以在程序運行時,根據上下文決定調用的方面,它們的先后順序,增加或刪除一個方面等。
而根據織入的時間,又可以分為三類,編譯時,載入時,運行時。編譯時織入可以在編譯前進行預處理,將兩種代碼自動混合,將方面中的代碼自動插入到功能模塊代碼的合適位置處,也可在編譯后,對編譯后的代碼進行操作。載入時織入是在代碼載入時,實現代碼的織入。運行時織入則在運行時,根據對方法的調用執行適當的方面代碼以實現織入。
以AOP的Java實現為例,包括使用反射(Reflection),基于動態代理(DynamicProxy)或其它機制的攔截框架,基于元數據(Metadata)的操作,以及類載入時對字節碼的操作等。隨著AOP應用的進一步推廣,相信會有更多新的織入方式出現。
文章來源于領測軟件測試網 http://www.kjueaiud.com/