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