<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    捕風之巢

    統計

    留言簿(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 捕風 閱讀(303) 評論(0)  編輯  收藏 所屬分類: java高級

    主站蜘蛛池模板: 成人a视频片在线观看免费| 亚洲人成电影网站色www| 成人一级免费视频| 免费一级毛片在线播放不收费| 亚洲人成色4444在线观看| 蜜桃视频在线观看免费网址入口| 亚洲国产精品成人久久久| 成年人视频免费在线观看| 亚洲人成伊人成综合网久久| 国产福利在线观看免费第一福利| 精品亚洲国产成人| 午夜无遮挡羞羞漫画免费| 亚洲成a∨人片在无码2023| 午夜毛片不卡高清免费| 免费无码专区毛片高潮喷水| 亚洲欧洲日产国码高潮αv| 国产综合免费精品久久久| 狠狠色伊人亚洲综合成人| 久久久久国产免费| 亚洲AV无码精品蜜桃| 四虎影视精品永久免费网站| 一级做a爰黑人又硬又粗免费看51社区国产精品视| 四虎影在线永久免费观看| 两性色午夜视频免费网| 亚洲精品私拍国产福利在线| 四虎免费影院ww4164h| 亚洲AV无码一区二区大桥未久| 亚洲国产免费综合| 日韩精品人妻系列无码专区免费 | 一级毛片免费不卡直观看| 久久久久无码专区亚洲av| 久久99热精品免费观看动漫 | mm1313亚洲国产精品美女| 免费网站观看WWW在线观看| 久久精品国产亚洲AV香蕉| 在线看片无码永久免费aⅴ| 中国精品一级毛片免费播放| 亚洲人成网站日本片| 亚洲精品国精品久久99热| 最近免费中文字幕大全免费版视频 | WWW国产成人免费观看视频|