閑人野居
          好好學習,天天向上
          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 布衣郎 閱讀(4815) 評論(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則在方法外,由其他方法調用  回復  更多評論
            

          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(12)

          隨筆分類(59)

          隨筆檔案(57)

          blog

          java

          uml

          搜索

          •  

          積分與排名

          • 積分 - 357339
          • 排名 - 155

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 平谷区| 云霄县| 庄浪县| 深泽县| 习水县| 九台市| 凤城市| 五原县| 肥乡县| 香格里拉县| 友谊县| 砀山县| 周口市| 佛山市| 长沙市| 凤阳县| 娱乐| 西平县| 博客| 义乌市| 马关县| 汉沽区| 唐河县| 柞水县| 萝北县| 龙南县| 鲁甸县| 扎囊县| 达尔| 大兴区| 东港市| 奉新县| 东源县| 平安县| 富源县| 西昌市| 沂水县| 肥城市| 晋州市| 铜川市| 芦溪县|