Aspect Oriented Programming(AOP)是較為熱門的一個(gè)話題邦投。AOP,國內(nèi)大致譯作“面向切面編程”膨更。
“面向切面編程”,這樣的名字并不是非常容易理解挺邀,且容易產(chǎn)生一些誤導(dǎo)。筆者不止一次聽到類似“OOP/OOD11即將落伍灯萍,AOP是新一代軟件開發(fā)方式”這樣的發(fā)言轧铁。顯然,發(fā)言者并沒有理解AOP的含義旦棉。Aspect齿风,沒錯(cuò),的確是“方面”的意思绑洛。不過救斑,華語傳統(tǒng)語義中的“方面”,大多數(shù)情況下指的是一件事情的不同維度真屯、或者說不同角度上的特性脸候,比如我們常說:“這件事情要從幾個(gè)方面來看待”,往往意思是:需要從不同的角度來看待同一個(gè)事物。這里的“方面”运沦,指的是事物的外在特性在不同觀察角度下的體現(xiàn)泵额。而在AOP中,Aspect的含義携添,可能更多的理解為“切面”比較合適梯刚。所以筆者更傾向于“面向切面編程”的譯法。
可以通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)在不修改源代碼的情況下給程序動(dòng)態(tài)統(tǒng)一添加功能的一種技術(shù)薪寓。AOP實(shí)際是GoF設(shè)計(jì)模式的延續(xù)亡资,設(shè)計(jì)模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,提高代碼的靈活性和可擴(kuò)展性,AOP可以說也是這種目標(biāo)的一種實(shí)現(xiàn)向叉。
在Spring中提供了面向切面編程的豐富支持锥腻,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已母谎。它們并不負(fù)責(zé)(甚至是意識(shí))其它的系統(tǒng)級(jí)關(guān)注點(diǎn)瘦黑,例如日志或事務(wù)支持。
日志記錄奇唤,性能統(tǒng)計(jì)幸斥,安全控制,事務(wù)處理咬扇,異常處理等等甲葬。
將日志記錄,性能統(tǒng)計(jì)懈贺,安全控制经窖,事務(wù)處理,異常處理等代碼從業(yè)務(wù)邏輯代碼中劃分出來梭灿,通過對(duì)這些行為的分離画侣,我們希望可以將它們獨(dú)立到非指導(dǎo)業(yè)務(wù)邏輯的方法中,進(jìn)而改變這些行為的時(shí)候不影響業(yè)務(wù)邏輯的代碼堡妒。
實(shí)現(xiàn)項(xiàng)目
AOP是一個(gè)概念配乱,并沒有設(shè)定具體語言的實(shí)現(xiàn),它能克服那些只有單繼承特性語言的缺點(diǎn)(如Java)皮迟,AOP具體實(shí)現(xiàn)有以下幾個(gè)項(xiàng)目:
AspectJ (TM): 創(chuàng)建于Xerox PARC. 有近十年歷史搬泥,成熟
缺點(diǎn):過于復(fù)雜;破壞封裝万栅;需要專門的Java編譯器佑钾。
動(dòng)態(tài)AOP:使用JDK的動(dòng)態(tài)代理API或字節(jié)碼Bytecode處理技術(shù)。
基于動(dòng)態(tài)代理API的具體項(xiàng)目有:
JBoss 4.0 JBoss 4.0服務(wù)器
基于字節(jié)碼的項(xiàng)目有:
aspectwerkz 烦粒,spring
作用
面向過程編程離我們已經(jīng)有些遙遠(yuǎn),面向?qū)ο缶幊?/a>正主宰著軟件世界。當(dāng)每個(gè)新的軟件設(shè)計(jì)師都被要求掌握如何將需求功能轉(zhuǎn)化成一個(gè)個(gè)類扰她,并且定義它們的數(shù)據(jù)成員兽掰、行為,以及它們之間復(fù)雜的關(guān)系的時(shí)候徒役,面向切面編程(Aspect-Oriented Programming孽尽,AOP)為我們帶來了新的想法、新的思想忧勿、新的模式杉女。
如果說面向?qū)ο缶幊淌顷P(guān)注將需求功能劃分為不同的并且相對(duì)獨(dú)立,封裝良好的類鸳吸,并讓它們有著屬于自己的行為熏挎,依靠繼承和多態(tài)等來定義彼此的關(guān)系的話;那么面向切面編程則是希望能夠?qū)⑼ㄓ眯枨蠊δ軓牟幌嚓P(guān)的類當(dāng)中分離出來晌砾,能夠使得很多類共享一個(gè)行為坎拐,一旦發(fā)生變化,不必修改很多類养匈,而只需要修改這個(gè)行為即可哼勇。
面向切面編程是一個(gè)令人興奮不已的新模式。就開發(fā)軟件系統(tǒng)而言呕乎,它的影響力必將會(huì)和有著數(shù)十年應(yīng)用歷史的面向?qū)ο缶幊?/a>一樣巨大积担。面向切面編程和面向?qū)ο缶幊滩坏皇腔ハ喔?jìng)爭(zhēng)的技術(shù)而且彼此還是很好的互補(bǔ)。面向?qū)ο缶幊讨饕糜跒橥粚?duì)象層次的公用行為建模猬仁。它的弱點(diǎn)是將公共行為應(yīng)用于多個(gè)無關(guān)對(duì)象模型之間磅轻。而這恰恰是面向切面編程適合的地方。有了 AOP逐虚,我們可以定義交叉的關(guān)系聋溜,并將這些關(guān)系應(yīng)用于跨模塊的、彼此不同的對(duì)象模型叭爱。AOP 同時(shí)還可以讓我們層次化功能性而不是嵌入功能性撮躁,從而使得代碼有更好的可讀性和易于維護(hù)。它會(huì)和面向?qū)ο缶幊毯献鞯煤芎谩?/p>
AOP 是一個(gè)概念买雾,一個(gè)規(guī)范把曼,本身并沒有設(shè)定具體語言的實(shí)現(xiàn),這實(shí)際上提供了非常廣闊的發(fā)展的空間漓穿。AspectJ是AOP的一個(gè)很悠久的實(shí)現(xiàn)嗤军,它能夠和 Java 配合起來使用。
介紹 AspectJ 的使用和編碼不是本文的目的晃危,你可以在 Google 上找到很多有關(guān)它的材料叙赚。
這里只是重溫 AspectJ 中幾個(gè)必須要了解的概念:
Aspect: Aspect 聲明類似于 Java 中的類聲明老客,在 Aspect 中會(huì)包含著一些 Pointcut 以及相應(yīng)的 Advice。
Joint point:表示在程序中明確定義的點(diǎn)震叮,典型的包括方法調(diào)用胧砰,對(duì)類成員的訪問以及異常處理程序塊的執(zhí)行等等,它自身還可以嵌套其它 joint point苇瓣。
Pointcut:表示一組 joint point尉间,這些 joint point 或是通過邏輯關(guān)系組合起來,或是通過通配击罪、正則表達(dá)式等方式集中起來哲嘲,它定義了相應(yīng)的 Advice 將要發(fā)生的地方。
Advice:Advice 定義了在 pointcut 里面定義的程序點(diǎn)具體要做的操作媳禁,它通過 before眠副、after 和 around 來區(qū)別是在每個(gè) joint point 之前、之后還是代替執(zhí)行的代碼损话。
下面要討論的這些問題侦啸,也許正是接觸了 AOP 之后所困惑的。
AOP 幫助我們解決了新的問題沒有丧枪?
AOP 并沒有幫助我們解決任何新的問題光涂,它只是提供了一種更好的辦法,能夠用更少的工作量來解決現(xiàn)有的一些問題拧烦,并且使得系統(tǒng)更加健壯忘闻,可維護(hù)性更好。同時(shí)恋博,它讓我們?cè)谶M(jìn)行系統(tǒng)架構(gòu)和模塊設(shè)計(jì)的時(shí)候多了新的選擇和新的思路齐佳。