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

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

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

    閑人野居
    好好學習,天天向上
    posts - 57,  comments - 137,  trackbacks - 0
    ??? 這兩天忙著看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-17 20:00 布衣郎 閱讀(4813) 評論(3)  編輯  收藏 所屬分類: aop

    FeedBack:
    # re: 關于AspectJ 中的pointcut 語法
    2006-10-18 14:25 | 123bingbing
    增開7群,號碼 30440732
    8群 30756649
    9群 30178567
    10群 28694497

    我們的qq群:15096318 學習程序的都可以來  回復  更多評論
      
    # re: 關于AspectJ 中的pointcut 語法
    2007-04-01 16:09 | coolfish
    # 方法執行:execution(MethodSignature)
    # 方法調用:call(MethodSignature)

    這兩個區別在哪?  回復  更多評論
      
    # re: 關于AspectJ 中的pointcut 語法
    2007-04-02 08:05 | 布衣郎
    @coolfish
    execution(MethodSignature)表示在方法體中

    call則在方法外,由其他方法調用  回復  更多評論
      

    <2007年4月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

    常用鏈接

    留言簿(12)

    隨筆分類(59)

    隨筆檔案(57)

    blog

    java

    uml

    搜索

    •  

    積分與排名

    • 積分 - 357234
    • 排名 - 155

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产一级大片免费看| 亚洲午夜无码久久久久软件| 午夜视频免费成人| 久操免费在线观看| 免费夜色污私人影院网站电影| 亚洲国产精品成人综合久久久 | 久久久久亚洲av毛片大| 大学生一级特黄的免费大片视频| 无码av免费一区二区三区试看| 四虎影视久久久免费观看| 一区二区亚洲精品精华液| 亚洲精品中文字幕无码AV| 亚洲午夜久久久久妓女影院 | 亚洲一区二区三区不卡在线播放| 亚洲热线99精品视频| 免费A级毛片无码A| 日韩午夜免费视频| 四虎影院免费视频| 成年女人免费视频播放77777 | 亚洲国产精品成人综合色在线婷婷| 亚洲Av综合色区无码专区桃色| 伊伊人成亚洲综合人网7777| 婷婷综合缴情亚洲狠狠尤物| 国产yw855.c免费视频| 在线观看亚洲免费| 国产精品久久香蕉免费播放| 午夜视频免费成人| 国产做床爱无遮挡免费视频| 国产美女精品久久久久久久免费| 男女交性永久免费视频播放| 成人免费一区二区三区在线观看| 最新免费jlzzjlzz在线播放| 无码人妻久久一区二区三区免费丨 | 久久久久久精品免费看SSS | 亚洲网站在线观看| 亚洲2022国产成人精品无码区| 亚洲国产精品无码久久SM| 亚洲阿v天堂在线| 老司机亚洲精品影院| 亚洲成a人片在线观看中文app| 亚洲欧洲国产经精品香蕉网|