????? AOP(Aspect Oroented Programming,面向切面編程)是消除代碼重復(fù)的一種方法。
????? AOP是OOP的延續(xù),是Aspect Oriented Programming的縮寫,意思是面向方面編程。AOP實際是GoF設(shè)計模式的延續(xù),設(shè)計模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,AOP可以說也是這種目標(biāo)的一種實現(xiàn)。
舉例:假設(shè)有在一個應(yīng)用系統(tǒng)中,有一個共享的數(shù)據(jù)必須被并發(fā)同時訪問,首先,將這個數(shù)據(jù)封裝在數(shù)據(jù)對象中,稱為Data Class,同時,將有多個訪問類,專門用于在同一時刻訪問這同一個數(shù)據(jù)對象。
為了完成上述并發(fā)訪問同一資源的功能,需要引入鎖Lock的概念,也就是說,某個時刻,當(dāng)有一個訪問類訪問這個數(shù)據(jù)對象時,這個數(shù)據(jù)對象必須上鎖Locked,用完后就立即解鎖unLocked,再供其它訪問類訪問。
使用傳統(tǒng)的編程習(xí)慣,我們會創(chuàng)建一個抽象類,所有的訪問類繼承這個抽象父類,如下:
abstract class Worker{
abstract void locked();
abstract void accessDataObject();
abstract void unlocked();
}
AOP的缺點
?
????? accessDataObject()方法需要有“鎖”狀態(tài)之類的相關(guān)代碼。
????? Java只提供了單繼承,因此具體訪問類只能繼承這個父類,如果具體訪問類還要繼承其它父類,比如另外一個如Worker的父類,將無法方便實現(xiàn)。
重用被打折扣,具體訪問類因為也包含“鎖”狀態(tài)之類的相關(guān)代碼,只能被重用在相關(guān)有“鎖”的場合,重用范圍很窄。
????? 仔細(xì)研究這個應(yīng)用的“鎖”,它其實有下列特性:
????? “鎖”功能不是具體訪問類的首要或主要功能,訪問類主要功能是訪問數(shù)據(jù)對象,例如讀取數(shù)據(jù)或更改動作。
????? “鎖”行為其實是和具體訪問類的主要功能可以獨立、區(qū)分開來的。
????? “鎖”功能其實是這個系統(tǒng)的一個縱向切面,涉及許多類、許多類的方法。如下圖:
?
因此,一個新的程序結(jié)構(gòu)應(yīng)該是關(guān)注系統(tǒng)的縱向切面,例如這個應(yīng)用的“鎖”功能,這個新的程序結(jié)構(gòu)就是aspect(方面)
在這個應(yīng)用中,“鎖”方面(aspect)應(yīng)該有以下職責(zé):
提供一些必備的功能,對被訪問對象實現(xiàn)加鎖或解鎖功能。以保證所有在修改數(shù)據(jù)對象的操作之前能夠調(diào)用lock()加鎖,在它使用完成后,調(diào)用unlock()解鎖。
AOP應(yīng)用范圍
很明顯,AOP非常適合開發(fā)J2EE容器服務(wù)器,目前JBoss 4.0正是使用AOP框架進(jìn)行開發(fā)。
具體功能如下:
Authentication 權(quán)限
Caching 緩存
Context passing 內(nèi)容傳遞
Error handling 錯誤處理
Lazy loading 懶加載
Debugging 調(diào)試
logging, tracing, profiling and monitoring 記錄跟蹤 優(yōu)化 校準(zhǔn)
Performance optimization 性能優(yōu)化
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務(wù)
AOP有必要嗎?
當(dāng)然,上述應(yīng)用范例在沒有使用AOP情況下,也得到了解決,例如JBoss 3.XXX也提供了上述應(yīng)用功能,但是沒有使用AOP。
但是,使用AOP可以讓我們從一個更高的抽象概念來理解軟件系統(tǒng),AOP也許提供一種有價值的工具。可以這么說:因為使用AOP結(jié)構(gòu),現(xiàn)在JBoss 4.0的源碼要比JBoss 3.X容易理解多了,這對于一個大型復(fù)雜系統(tǒng)來說是非常重要的。
從另外一個方面說,好像不是所有的人都需要關(guān)心AOP,它可能是一種架構(gòu)設(shè)計的選擇,如果選擇J2EE系統(tǒng),AOP關(guān)注的上述通用方面都已經(jīng)被J2EE容器實現(xiàn)了,J2EE應(yīng)用系統(tǒng)開發(fā)者可能需要更多地關(guān)注行業(yè)應(yīng)用方面aspect。
AOP具體實現(xiàn)
AOP是一個概念,并沒有設(shè)定具體語言的實現(xiàn),它能克服那些只有單繼承特性語言的缺點(如Java),目前AOP具體實現(xiàn)有以下幾個項目:
AspectJ (TM): 創(chuàng)建于Xerox PARC. 有近十年歷史,成熟
缺點:過于復(fù)雜;破壞封裝;需要專門的Java編譯器。
動態(tài)AOP:使用JDK的動態(tài)代理API或字節(jié)碼Bytecode處理技術(shù)。
基于動態(tài)代理API的具體項目有:
JBoss 4.0 JBoss 4.0服務(wù)器
nanning 這是以中國南寧命名的一個項目,搞不清楚為什么和中國相關(guān)?是中國人發(fā)起的?
基于字節(jié)碼的項目有:
aspectwerkz
spring ?
定義和概念
Term
術(shù)語
|
Definition
定義
|
Concern A particular issue
(關(guān)注特定問題)
|
感興趣應(yīng)用的特定問題、概念、范圍。例如,事務(wù)管理、持久化、日志、安全等。
|
Crosscutting Concern
(橫切關(guān)注點)
|
在關(guān)注點實現(xiàn)中貫穿了很多類,這在面向?qū)ο螅∣OP)中通常很難實現(xiàn)和維護(hù)。
|
Aspect
(切面)
|
模塊化的橫切關(guān)注點,通過代碼的聚合和隔離實現(xiàn)。
|
Join Point
(連接點)
|
在程序或者類執(zhí)行時的一個點。在Spring的AOP實現(xiàn)中,連接點總是一個方法調(diào)用。其他的例子包括訪問字段(包括實例中字段的讀寫),變量和異常處理。
|
Advice
(通知)
|
特定連接點所采取的動作。Spring有幾種不同類型的通知,包括around、before、throws和after returning。在這幾種類型的通知中,around是最強(qiáng)大的,在方法調(diào)用的前后都有執(zhí)行一些操作的機(jī)會。之前用到的TraceInterceptor就是around類型的通知,它實現(xiàn)了AOP聯(lián)盟的MethodInterceptor接口。通過實現(xiàn)下面的Spring接口可以使用其他類型的通知:
????????? MethodBeforeAdvice
????????? ThrowsAdvice
????????? AfterReturningAdvice
|
Pointcut
(切入點)
|
連接點的集合,這些連接點確認(rèn)何時一個通知將會觸發(fā)。切入點通常使用正則表達(dá)式或者是通配符語法。
|
Introduction
(引入)
|
添加字段或者方法到一個通知類。Spring允許你在任何通知對象上引入新的接口。例如,你可以使用引入以便讓任意對象實現(xiàn)IsModified接口,來簡化緩存。
|
Weaving
(組織)
|
裝配切面來創(chuàng)建一個被通知對象。可以在編譯期間完成(像AspectJ做的那樣)也可以在運(yùn)行時完成。本章后面的組織策略部分詳細(xì)討論不同的組織策略(也就是實現(xiàn)AOP)。
|
Interceptor
(攔截器)
|
一種AOP實現(xiàn)策略,對與特點的連接點,可能存在一個攔截器鏈。
|
AOP Proxy
(AOP代理)
|
AOP框架創(chuàng)建的對象,包括通知。在Spring中,一個AOP代理可能是JDK動態(tài)代理或者是CGLIB代理。
|
Target Object
(目標(biāo)對象)
|
包含連接點的對象。在使用攔截的框架中,它是在攔截器鏈末端的對象實例。也叫做被通知對象或者被代理對象。
|
切入點
組織策略
便于應(yīng)用的代理bean
事務(wù)
jwebee
我的個人網(wǎng)站