??? 這兩天忙著看AspectJ in Action 為了補(bǔ)一下AOP知識(shí)。看了Spring 2.0的規(guī)范,其中AOP部分已經(jīng)基本融合了AspectJ,看來有必要看一看AspectJ了。
?? 看了很多AOP的文章了,AOP這兩年發(fā)展的很慢,沒有什么新意,現(xiàn)在到處都是SOA,SCA了,不過研究了一下,覺得還是很有幫助的。尤其是增加系統(tǒng)的契約性和模塊的獨(dú)立性來說,很有幫助。
?? 當(dāng)然,學(xué)東西,基礎(chǔ)很重要。下面就說說AspectJ中的基本語法,有興趣的可以看看AspectJ in Action。
?? 先來說說pointcut,從字面的意思說的是切面的意思。也就是橫切的時(shí)候,會(huì)有哪些執(zhí)行點(diǎn)會(huì)被識(shí)別。只有先識(shí)別了,才能執(zhí)行相應(yīng)的Advice。
?? 基本的定義如下:
??
?? public
pointcut accountOperations:call(* Account.*(..))
??
??
1.通配符和pointcut 操作符
- ?? *? 表示任何數(shù)量的字符,除了(.)
- ??? .. 表示任何數(shù)量的字符包括任何數(shù)量的(.)
- ?????? + 描述指定類型的任何子類或者子接口
??? 同java一樣,提供了一元和二元的條件表達(dá)操作符。
??? 一元操作符:!
????? 二元操作符:||和&&
????? 優(yōu)先權(quán)同java
????? 2.簽名語法
? 類型簽名樣式
? 主要的例子:? Account????????????????????????????? 類型Account
??? *Account?? ?? ?? ?? ?? ?? ?? ?? ???? 使用Account名稱結(jié)束的類型,如SavingsAccount和CheckingAccount
??? java.*.Date???????????????????????? 類型Date在任何直接的java子包中,如java.util.Date和java.sql.Date
? ? java..*???????????????????????????????? 任何在java包或者所有子包中的類型,如java.awt和java.util或者java.awt.event 和java.util.logging
??? javax..*Model+?????????????????? 所有javax包或者子包中以Model結(jié)尾的類型和其所有子類,如TableModel,TreeModel。
? !vector ????? ????????????????????? 所有除了Vector的類型
? Vector|| Hashtable????????????? Vector或者Hashtable類型
? java.util.RandomAccess+??? 實(shí)現(xiàn)RandomAccess和List的所有子類?? && java.util.List+??
?? 方法和構(gòu)造器簽名模式
? public void Collection.clear():
? 在Collection中同樣簽名的clear方法
? public void Account.debit(float) throws InsufficientBalanceException:
? Account中同樣簽名的debit方法
? public void Account.set*(*)
? Account中以set開頭,并且只有一個(gè)參數(shù)類型的方法
? public void Account.*()
? Account中所有的沒有參數(shù)的public void 方法
?
? public * Account.*()
? Account中所有沒有參數(shù)的public 方法
? public * Account.*(..)
? Account中所有的public 方法
? * Account.*(..)
? Account中的所有方法,包括private方法
? !public * Account.*(..)
? 所有的非public 方法
?? * Account+.*(..)
?? 所有的方法,包括子類的方法
?? * java.io.Reader.read(..)
?? 所有的read方法
?? * java.io.Reader.read(char[],..)
?? 所有以read(char[])開始的方法,包括read(char[])和read(char[],int,int)
?? * javax..*.add*Listener(EventListener+)
?? 命名以add開始,以Listener結(jié)尾的方法,參數(shù)中為EventListener或子類
?? * *.*(..) throws RemoteException
?? 拋出RemoteException的所有方法
?? 構(gòu)造器,同上面
?? public Account.new()
?? 沒有參數(shù)的構(gòu)造器方法
??? 屬性簽名模式
??? 同方法一樣,屬性也查不多
??? * Account.*???
??? 所有的Account屬性
??? !public static * banking..*.*
??? 所有的非public static 屬性,在banking的包或者子包中
???
??? 3.主要的pointcuts類型
??
??? 分類pointcuts
??? 遵循特定的語法用于捕獲每一個(gè)種類的可使用連接點(diǎn)。
??? 主要的種類:
- 方法執(zhí)行:execution(MethodSignature)
- 方法調(diào)用:call(MethodSignature)
- 構(gòu)造器執(zhí)行:execution(ConstructorSignature)
- 構(gòu)造器調(diào)用:call(ConstructorSignature)
- 類初始化:staticinitialization(TypeSignature)
- 屬性讀操作:get(FieldSignature)
- 屬性寫操作:set(FieldSignature)
- 例外處理執(zhí)行:handler(TypeSignature)
- 對(duì)象初始化:initialization(ConstructorSignature)
- 對(duì)象預(yù)先初始化:preinitialization(ConstructorSignature)
- Advice執(zhí)行:adviceexecution()
??
基于控制流的pointcuts?? 主要包括兩種類型的控制流:
?? cflow(Pointcut),捕獲所有的連接點(diǎn)在指定的方法執(zhí)行中,包括執(zhí)行方法本身。
?? cflowbelow(Pointcut),捕獲所有的連接點(diǎn)在指定的方法執(zhí)行中,除了執(zhí)行方法本身。
?? 如以下的例子:
??
cflow(call(* Account.debit(..))?? 所有的debit方法中的連接點(diǎn),包括debit方法本身
??
cflowbelow(call(* Account.debit(..))?? 所有debit方法中的連接點(diǎn),除了debit方法本身
??
cflow(transactedOperations())?? 所有由transactedOperations捕獲的連接點(diǎn)
??
cflowbelow(execution(Account.new(..))?? 所有在Account 構(gòu)造器中執(zhí)行的連接點(diǎn)
??
基于詞匯結(jié)構(gòu)的連接點(diǎn)?? 源代碼片斷。,如within()和withincode()
?? within :捕獲在指定類或者方面中的程序體中的所有連接點(diǎn),包括內(nèi)部類。
?? Withincode:用于捕獲在構(gòu)造器或者方法中的所有連接點(diǎn),包括在其中的本地類
??
執(zhí)行對(duì)象連接點(diǎn)?? 匹配this,和target對(duì)象,作為方法被調(diào)用的對(duì)象。
?? this(Account),所有Account的實(shí)例的執(zhí)行點(diǎn),匹配所有的連接點(diǎn),如方法調(diào)用,屬性設(shè)置,當(dāng)前的執(zhí)行對(duì)象為Account,或者其子類。
?? target(Account):匹配所有的連接點(diǎn),目標(biāo)對(duì)象為Account或其子類。
?? 必須執(zhí)行相應(yīng)的類型,不能使用*,或者..通配符。當(dāng)前靜態(tài)方法,不能被匹配。
?? 在within()和this()中的區(qū)別:
?? 一個(gè)是程序體,而另一個(gè)為對(duì)象執(zhí)行。
??
參數(shù)pointcuts?? 用于捕獲參數(shù)類型的連接點(diǎn)。
?? args(String,..,int)
?? args(RemoteException)
??
條件檢測(cè)pointcuts?? if(System.currentTimeMillis()>triggerTime)
?? 基本的語法就這些,不過AspectJ5 已經(jīng)增加了不少語法,主要關(guān)于Annotation 的,不過這部分還沒有仔細(xì)研究,以后再講解吧。希望能有所幫助
??
posted on 2006-10-17 20:00
布衣郎 閱讀(4813)
評(píng)論(3) 編輯 收藏 所屬分類:
aop