AOP 面向切面編程

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>

實(shí)現(xiàn)

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í)候多了新的選擇和新的思路齐佳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市债沮,隨后出現(xiàn)的幾起案子炼吴,更是在濱河造成了極大的恐慌,老刑警劉巖疫衩,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硅蹦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡闷煤,警方通過查閱死者的電腦和手機(jī)童芹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲤拿,“玉大人假褪,你說我怎么就攤上這事〗辏” “怎么了生音?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵宁否,是天一觀的道長。 經(jīng)常有香客問我久锥,道長家淤,這世上最難降的妖魔是什么异剥? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任瑟由,我火速辦了婚禮,結(jié)果婚禮上冤寿,老公的妹妹穿的比我還像新娘歹苦。我一直安慰自己,他們只是感情好督怜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布殴瘦。 她就那樣靜靜地躺著,像睡著了一般号杠。 火紅的嫁衣襯著肌膚如雪蚪腋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天姨蟋,我揣著相機(jī)與錄音屉凯,去河邊找鬼。 笑死眼溶,一個(gè)胖子當(dāng)著我的面吹牛悠砚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堂飞,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼灌旧,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了绰筛?” 一聲冷哼從身側(cè)響起枢泰,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铝噩,沒想到半個(gè)月后衡蚂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薄榛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年讳窟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敞恋。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丽啡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硬猫,到底是詐尸還是另有隱情补箍,我是刑警寧澤改执,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站坑雅,受9級(jí)特大地震影響辈挂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裹粤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一终蒂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遥诉,春花似錦拇泣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苞笨,卻和暖如春债朵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瀑凝。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工序芦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猜丹。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓芝加,卻偏偏與公主長得像,于是被迫代替她去往敵國和親射窒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子藏杖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容