|
如果要做為一名合格的軟件架構(gòu)師,AOP是必須知道的一門技術(shù)。那么AOP是什么呢,這就是今天所討論的內(nèi)容(也是本人最近一陣子的學(xué)習(xí)總結(jié),希望大家多多指點(diǎn))。
AOP,全稱ASPect Oriented Programming,中文名稱叫面向方面編程,也叫面向切面編程。
在實(shí)際項(xiàng)目開發(fā)過程中,我們往往會(huì)注意到有一些模塊/功能,如權(quán)限,緩存等,需要存在于軟件的各個(gè)業(yè)務(wù)模塊中,而這些模塊/功能又與業(yè)務(wù)模塊沒有任何關(guān)系,甚至在設(shè)計(jì)業(yè)務(wù)模塊時(shí)我們完全不用考慮這些模塊/功能的存在,但是在開發(fā)過程中才發(fā)現(xiàn)這些模塊/功能會(huì)給我們帶來無盡的煩惱。因?yàn)閭鹘y(tǒng)的OOP方法考慮問題的出發(fā)點(diǎn)往往是要解決問題的本身和延伸,所以遇到此類情況時(shí)傳統(tǒng)的OOP方法就很難解決。然而對(duì)業(yè)務(wù)模塊和此類模塊稍作分析,我們就會(huì)發(fā)現(xiàn),其實(shí)它們本質(zhì)是相同的,只是解決的問題不同,對(duì)一個(gè)軟件的關(guān)注點(diǎn)不同,如下圖所示:
結(jié)合自己的經(jīng)驗(yàn),由圖可知,日志,安全,事務(wù)等一類的模塊在一個(gè)軟件項(xiàng)目中的位置,AOP要解決的就是此類問題。 AOP的目標(biāo)便是對(duì)這些“橫切關(guān)注點(diǎn)”和業(yè)務(wù)模塊解耦,從而提升軟件的穩(wěn)定性,擴(kuò)展性。
AOP通常包含以下主要概念:
- 方面(ASPect):一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)實(shí)現(xiàn)可能另外橫切多個(gè)對(duì)象。事務(wù)管理是J2EE應(yīng)用中橫切關(guān)注點(diǎn)中一個(gè)很好的例子。
- 連接點(diǎn)(Joinpoint):程序執(zhí)行過程中明確的點(diǎn),如方法的調(diào) 用或特定的異常被拋出。
- 通知(Advice):在特定的連接點(diǎn)AOP框架執(zhí)行的動(dòng)作。各種類型的通知包括“around”、“before”和“throws”通知。通知類型將在下面討論。許多AOP框架都是以攔截器做通知模型,維護(hù)一個(gè)“圍繞”連接點(diǎn)的攔截器鏈。
- 切入點(diǎn)(Pointcut):指定一個(gè)通知將被引發(fā)的一系列連接點(diǎn) 的集合。AOP框架必須允許開發(fā)者指定切入點(diǎn):例如,使用正則表達(dá)式。
- 引入(Introduction):添加方法或字段到通知化類。
- 接口(IsModified),來簡化緩存。
- 目標(biāo)對(duì)象(Target object):包含連接點(diǎn)的對(duì)象。也被用來 引用通知化或代理化對(duì)象。
- AOP代理: AOP框架創(chuàng)建的對(duì)象,包含通知。
- 織入(Weaving):組裝方面創(chuàng)建通知化對(duì)象。這可以在編譯時(shí)完成(例如使用ASPectJ編譯器),也可以在運(yùn)行時(shí)完成。Spring和其他一些純Java AOP框架, 使用運(yùn)行時(shí)織入。
AOP通知類型包括:
- Around通知: 包圍一個(gè)連接點(diǎn)的通知,如方法調(diào)用。這是最強(qiáng)大的通知。Aroud通知在方法調(diào)用前后完成自定義的行為。它們負(fù)責(zé)選擇繼續(xù)執(zhí)行連接點(diǎn)或直接返回它們自己的返回值或拋出異常來短路執(zhí)行。
- Before通知: 在一個(gè)連接點(diǎn)之前執(zhí)行的通知,但這個(gè)通知 不能阻止流程繼續(xù)執(zhí)行到連接點(diǎn)(除非它拋出一個(gè)異常)。
- Throws通知: 在方法拋出異常時(shí)執(zhí)行的通知。
- After returning通知: 在連接點(diǎn)正常完成后執(zhí)行的通知, 例如,如果一個(gè)方法正常返回,沒有拋出異常。
- Around通知是最通用的通知類型。大部分基于攔截器的AOP框架如Nanning和JBoss4只提供 Around通知。
通常AOP的關(guān)注點(diǎn)有以下幾方面:
- 權(quán)限(Authentication)
- 緩存(Cache)
- 內(nèi)容傳遞(Context passing)
- 錯(cuò)誤處理(Error handling)
- 懶加載(Lazy loading)
- 調(diào)試(Debug)
- 日志(Log)
- 跟蹤,優(yōu)化,校準(zhǔn)(tracing, profiling and monitoring)
- 性能優(yōu)化(Performance optimization)
- 持久化(Persistence)
- 資源池(Resource pooling)
- 同步(Synchronization)
- 事務(wù)(Transactions)
了解了AOP的應(yīng)用場(chǎng)景,下面以權(quán)限為例,比較一下傳統(tǒng)方法與AOP方法各自的實(shí)現(xiàn),說明AOP技術(shù)的應(yīng)用。
傳統(tǒng)方法:
BusinessA ClassicsPermission() {
if (tag == "Pass") {
return new BusinessA();
}
throw new Exception("你沒有權(quán)限操作BusinessA.");
}
it知識(shí)庫:軟件架構(gòu)師之AOP,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。