wiflish
          Loving Life! Loving Coding!
          posts - 98,comments - 98,trackbacks - 0

          【轉】AOP實現(三)——Spring 2.0中Pointcut的定義

          關鍵字: Pointcut的定義
          Spring 2.0 中, Pointcut 的定義包括兩個部分: Pointcut 表示式 (expression) Pointcut 簽名 (signature) 。讓我們先看看 execution 表示式的格式:
          java 代碼
          1. execution(modifier-pattern?
          2. ????????? ret-type-pattern
          3. ????????? declaring-type-pattern?
          4. ????????? name-pattern(param-pattern)
          5. ????????? throws-pattern?)

          括號中各個 pattern 分別表示修飾符匹配( modifier-pattern? )、返回值匹配( ret-type-pattern )、類路徑匹配( declaring-type-pattern? )、方法名匹配( name-pattern )、參數匹配( (param-pattern) )、異常類型匹配( throws-pattern? ),其中后面跟著“ ? ”的是可選項。
          在各個 pattern 中可以使用“ * ”來表示匹配所有。在 (param-pattern) 中,可以指定具體的參數類型,多個參數間用“ , ”隔開,各個也可以用“ * ”來表示匹配任意類型的參數,如 (String) 表示匹配一個 String 參數的方法; (*,String) 表示匹配有兩個參數的方法,第一個參數可以是任意類型,而第二個參數是 String 類型;可以用 (..) 表示零個或多個任意參數。
          現在來看看幾個例子:
          1 execution(* *(..))
          表示匹配所有方法
          2 execution(public * com. savage.service.UserService.*(..))
          表示匹配 com.savage.server.UserService 中所有的公有方法
          3 execution(* com.savage.server..*.*(..))
          表示匹配 com.savage.server 包及其子包下的所有方法
          除了 execution 表示式外,還有 within this target args Pointcut 表示式。 一個 Pointcut 定義由 Pointcut 表示式和 Pointcut 簽名組成,例如:
          java 代碼
          1. //Pointcut表示式
          2. @Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
          3. //Point簽名
          4. privatevoid log(){}?????????????????????????????

          然后要使用所定義的 Pointcut 時,可以指定 Pointcut 簽名,如
          java 代碼
          1. @Before("og()")

          上面的定義等同與:
          java 代碼
          1. @Before ( "execution(* com.savage.aop.MessageSender.*(..))" )

          Pointcut 定義時,還可以使用 && || ! 運算,如:
          java 代碼
          1. @Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
          2. privatevoid logSender(){}

          3. @Pointcut("execution(* com.savage.aop.MessageReceiver.*(..))")
          4. privatevoid logReceiver(){}

          5. @Pointcut("logSender() || logReceiver()")
          6. privatevoid logMessage(){}

          這個例子中, logMessage() 將匹配任何 MessageSender MessageReceiver 中的任何方法。
          還可以將一些公用的 Pointcut 放到一個類中,以供整個應用程序使用,如:
          java 代碼
          1. package com.savage.aop;

          2. import org.aspectj.lang.annotation.*;

          3. publicclass Pointcuts {
          4. ?? @Pointcut("execution(* *Message(..))")
          5. ?? publicvoid logMessage(){}

          6. ?? @Pointcut("execution(* *Attachment(..))")
          7. ?? publicvoid logAttachment(){}

          8. ?? @Pointcut("execution(* *Service.*(..))")
          9. ?? publicvoid auth(){}
          10. }

          在使用這些 Pointcut 時,指定完整的類名加上 Pointcut 簽名就可以了,如:
          java 代碼
          1. package com.savage.aop;

          2. import org.aspectj.lang.JoinPoint;
          3. import org.aspectj.lang.annotation.*;

          4. @Aspect
          5. publicclass LogBeforeAdvice {
          6. ?? @Before("com.sagage.aop.Pointcuts.logMessage()")
          7. ?? publicvoid before(JoinPoint joinPoint) {
          8. ????? System.out.println("Logging before " + joinPoint.getSignature().getName());
          9. ?? }
          10. }

          當基于 XML Sechma 實現 Advice 時,如果 Pointcut 需要被重用,可以使用 來聲明 Pointcut ,然后在需要使用這個 Pointcut 的地方,用 pointcut-ref 引用就行了,如:
          xml 代碼
          ?
          1. <aop:config>??
          2. ????<aop:pointcut?id="log"???
          3. ??????????expression="execution(*?com.savage.simplespring.bean.MessageSender.*(..))"/>??
          4. ????<aop:aspect?id="logging"?ref="logBeforeAdvice">??
          5. ????????<aop:before?pointcut-ref="log"?method="before"/>??
          6. ????????<aop:after-returning?pointcut-ref="log"?method="afterReturning"/>??
          7. ????</aop:aspect>??
          8. </aop:config>??

          posted on 2008-12-30 23:15 想飛的魚 閱讀(1171) 評論(0)  編輯  收藏 所屬分類: spring

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 张家界市| 洛川县| 盐城市| 河间市| 伊宁县| 寻甸| 南皮县| 博客| 霍邱县| 社旗县| 化德县| 抚远县| 平度市| 栾川县| 土默特右旗| 桂林市| 樟树市| 青浦区| 连山| 桂阳县| 中江县| 侯马市| 克拉玛依市| 万山特区| 沁水县| 泸州市| 米林县| 石狮市| 神农架林区| 漳州市| 宝兴县| 岚皋县| 涿鹿县| 三明市| 荣成市| 武夷山市| 海南省| 赤水市| 邵东县| 阜阳市| 聊城市|