捕風之巢

          統計

          留言簿(3)

          java友情鏈接

          閱讀排行榜

          評論排行榜

          關于AspectJ 中的pointcut 語法

          ??? 這兩天忙著看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名稱結束的類型,如SavingsAccountCheckingAccount
          ???
          java.*.Date???????????????????????? 類型Date在任何直接的java子包中,如java.util.Datejava.sql.Date
          ? ?
          java..*???????????????????????????????? 任何在java包或者所有子包中的類型,如java.awtjava.util或者java.awt.event java.util.logging
          ???
          javax..*Model+?????????????????? 所有javax包或者子包中以Model結尾的類型和其所有子類,如TableModel,TreeModel
          ?
          vector ????? ????????????????????? 所有除了Vector的類型
          ?
          Vector|| Hashtable????????????? Vector或者Hashtable類型
          ?
          java.util.RandomAccess+??? 實現RandomAccessList的所有子類
          ?? && 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-19 17:28 捕風 閱讀(305) 評論(0)  編輯  收藏 所屬分類: java高級

          主站蜘蛛池模板: 新兴县| 和平县| 镇康县| 军事| 遂宁市| 视频| 高尔夫| 漳州市| 庆云县| 兖州市| 六安市| 阜城县| 崇文区| 鹤山市| 胶州市| 康保县| 华池县| 瑞昌市| 毕节市| 开鲁县| 凤凰县| 琼结县| 金湖县| 马龙县| 甘谷县| 柏乡县| 孝感市| 大荔县| 工布江达县| 新昌县| 岳阳市| 万山特区| 奇台县| 历史| 肥乡县| 崇信县| 奉节县| 乳山市| 锡林郭勒盟| 怀集县| 育儿|