AOP(Apsect Oriented Programming)概念的正式出現(xiàn)也有一些時(shí)日了,但是它在程序構(gòu)造過程中似乎仍未找到合適的切入點(diǎn),一般系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn)很少將AOP作為必要的技術(shù)元素。AOP作為一種普適的技術(shù)思想,它所代表的是程序結(jié)構(gòu)空間中的定位和組裝技術(shù)。http://canonical.javaeye.com/blog/34941AOP使我們可以通過非侵入性的方式動(dòng)態(tài)修改“任意”已經(jīng)構(gòu)建好的程序,而不需要事前有大量的設(shè)計(jì)準(zhǔn)備。原則上說,這種技術(shù)思想是可以在任何程序語言基礎(chǔ)上進(jìn)行表達(dá)的,并不是只有java, C#這樣的面向?qū)ο笳Z言才允許AOP操作. Witrix平臺(tái)中所應(yīng)用的部分技術(shù)與AOP有些類似,只是大量的結(jié)構(gòu)調(diào)整表現(xiàn)為xml生成和xml變換,在具體的使用方式上也有一些微妙的差異。
相對于通用程序語言,xml語言其實(shí)是AOP技術(shù)的一個(gè)更加合適的形式載體。
1. xml格式特殊的規(guī)范性確保了在最細(xì)的邏輯粒度上,程序結(jié)構(gòu)也是可識(shí)別的,可操縱的(在這一點(diǎn)上非常類似于函數(shù)式語言)。而所有的命令式語言(imperative language)中,函數(shù)內(nèi)部的結(jié)構(gòu)都是很難采用統(tǒng)一方式進(jìn)行描述和定位的。
Xml代碼
<ns1:loop>
<rpt:Row/>
</ns1:loop>
2. xml節(jié)點(diǎn)的坐標(biāo)可以采用xpath或者css選擇符等通用方式進(jìn)行描述,而一般程序結(jié)構(gòu)無法達(dá)到xml格式這樣的均一性,其中的坐標(biāo)定位方式要復(fù)雜得多。
3. xml節(jié)點(diǎn)上可以增加任意屬性,不同的屬性可以屬于不同的命名空間(namespace),這些屬性可以輔助AOP的定位機(jī)制。而一般程序語言中如果沒有Annotation機(jī)制, 則定位只能依賴于函數(shù)名和類名(函數(shù)參數(shù)只有類型沒有名稱),而類名和函數(shù)名隨時(shí)可能因?yàn)闃I(yè)務(wù)變化而調(diào)整(不是專為定位而存在), 由此構(gòu)建的切點(diǎn)描述符是不穩(wěn)定的。
Xml代碼
<ui:PageTable pager="${pager}" cache:timeout="1000" />
4. xml節(jié)點(diǎn)的增刪改查顯然要比字節(jié)碼生成技術(shù)要簡單和直觀得多。
AOP技術(shù)難以找到應(yīng)用的一個(gè)重要原因在于很多人機(jī)械式的將它定位為一種橫切技術(shù),認(rèn)為它的價(jià)值完全在于某個(gè)確定的切面可以插入到多個(gè)不同的切點(diǎn),實(shí)現(xiàn)系統(tǒng)的橫向分解。而在實(shí)際應(yīng)用中,業(yè)務(wù)層面上很少具有可抽象的固定的共同性,我們所迫切需要的一般是對已有程序結(jié)構(gòu)進(jìn)行動(dòng)態(tài)擴(kuò)展的一種能力。橫切是AOP的一種特殊的應(yīng)用,但不是它的全部。相對于繼承(inheritance)等依賴于概念詮釋的結(jié)構(gòu)擴(kuò)展機(jī)制,AOP所代表正是對程序結(jié)構(gòu)空間進(jìn)行任意操縱的一種能力。AOP可以為基礎(chǔ)結(jié)構(gòu)增加功能,改變原有功能實(shí)現(xiàn),也可以取消原有功能實(shí)現(xiàn),它不需要把所有的擴(kuò)展邏輯按照樹形結(jié)構(gòu)進(jìn)行組織,不要求在基礎(chǔ)結(jié)構(gòu)中為擴(kuò)展編寫特殊的代碼。這種自由的結(jié)構(gòu)擴(kuò)展能力在Witrix平臺(tái)中被發(fā)展為“實(shí)現(xiàn)業(yè)務(wù)代碼與平臺(tái)基礎(chǔ)架構(gòu)之間的動(dòng)態(tài)融合”。
在Witrix平臺(tái)的實(shí)際應(yīng)用中,AOP的切點(diǎn)匹配能力并不是十分重要。一般情況下我們主要通過整體結(jié)構(gòu)規(guī)劃來確保控制點(diǎn)意義明確且相對集中,因此不需要額外通過切點(diǎn)匹配進(jìn)行業(yè)務(wù)功能的再組織,不需要再次從雜亂的程序邏輯中重新發(fā)現(xiàn)特殊的控制點(diǎn)。例如在Witrix平臺(tái)的Jsplet框架中所有后臺(tái)事件響應(yīng)都通過objectName和objectEvent參數(shù)觸發(fā),在觸發(fā)后臺(tái)事件響應(yīng)函數(shù)之前都會(huì)調(diào)用bizflow文件中的beforeAction段。
在bizflow文件中,aop操作是明確指定到具體函數(shù)的,使用模糊匹配在一般情況下只會(huì)使問題變得不必要的復(fù)雜化。例如擴(kuò)展actQuery函數(shù)
Xml代碼
<action id="aop-Query-default">
<source>
通過自定義標(biāo)簽抽象出多個(gè)Action之間的共用代碼
<app:DoWorkA/>
</source>
</action>
在Witrix平臺(tái)中結(jié)構(gòu)組裝主要是通過自定義標(biāo)簽庫和extends算子來實(shí)現(xiàn),它們都依賴于xml格式的規(guī)范性。
1. 通過在custom目錄下實(shí)現(xiàn)同名的自定義標(biāo)簽,即可覆蓋Witrix平臺(tái)所提供的缺省標(biāo)簽實(shí)現(xiàn),這里所依賴的并不是復(fù)雜的匹配過程,而是自然直觀的映射過程。http://canonical.javaeye.com/blog/196826
2. 所有的xml配置文件支持extends操作,它允許定制兩個(gè)具有業(yè)務(wù)含義的xml節(jié)點(diǎn)之間的結(jié)構(gòu)融合規(guī)則。例如
Xml代碼
<biz-flow extends="docflow">
實(shí)際使用中, AOP技術(shù)的一個(gè)應(yīng)用難點(diǎn)在于狀態(tài)空間的管理問題。一般interceptor中所能訪問的變量局限為this指針?biāo)鶖y帶的成員變量,以及函數(shù)調(diào)用時(shí)傳入的調(diào)用參數(shù)。interceptor很難在狀態(tài)空間中創(chuàng)建新的變量,也很難讀取在其他地方所產(chǎn)生的狀態(tài)變量。例如對于如下擴(kuò)展 A(arg1); B(arg2); C(arg3); =〉 Ax(arg1); B(arg2); Cx(arg3); 因?yàn)樵械恼{(diào)用序列中沒有傳遞額外的參數(shù),因此A和C的擴(kuò)展函數(shù)之間很難實(shí)現(xiàn)共享內(nèi)部變量x。在TPL模板語言中,tpl本身是無狀態(tài)的,狀態(tài)變量通過外部的$thisContext對象統(tǒng)一管理。通過這種行為與狀態(tài)的分離,結(jié)合靈活的變量作用域控制機(jī)制,可以以比較簡單的方式實(shí)現(xiàn)擴(kuò)展函數(shù)之間的信息共享。
聯(lián)系客服