最愛Java

          書山有路勤為徑,學海無涯苦作舟

          《AspectJ Cookbook》讀書筆記九: 捕獲程序作用域內的連接點

              切入點定義設計中的常用方式是:基于關注的程序作用域,限制捕獲連接點的范圍。這可以讓你即使控制在進一步的切入點定義中將會涉及哪些連接點。
              本章中的切入點相當容易理解,并且他們是AspectJ中一些常用的元素。例如,廣泛使用的within(TypePattern)切入點將以!within(%THIS_ASPECT%)形式使用它。這個AspectJ術語限制了當前方面之外的每個連接點的作用域,從而可以防止通知觸發對相同通知塊的遞歸調用,并導致一個無限循環。
              一. 捕獲特定類中的所有連接點
              使用within(TypePattern)切入點,利用TypePattern指定特定類類型模式,within(TypePattern)切入點的語法如下:
              pointcut <pointcut name>(<any values to be picked up>) : within(<class>);

              within(TypePattern)切入點具有3個關鍵特征:
                  1.within(TypePattern)切入點捕獲指定類作用域中的所有連接點。
                  2.within(TypePattern)切入點極少孤立使用。相反,它通常與切入點結合使用,用于減少將觸發附帶通知的連接點。
                  3.TypePattern可以包含通配符,用于選擇不同類上的一系列連接點。


           

           

          package com.aspectj;

          public aspect WithinClassRecipe {
              
          /**
               * Specifies calling advice on any join point encountered within
               * the defined scope:
               * 
               * Scope:MyClass
               
          */

              pointcut withinMyClass() : within(MyClass);
              
              
          //Advice declaration
              before() : withinMyClass() && !within(WithinClassRecipe+{
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by withinMyClass()");
                  System.out.println(
          "Join Point Kind: " + thisJoinPoint.getKind());
                  System.out.println(
          "Signature: " + thisJoinPoint.getStaticPart().getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getStaticPart().getSourceLocation());
                  System.out.println(
          "-----------------------------------------");
              }


          }



          二. 捕獲特定包中的所有連接點
              within(TypePattern)切入點提供一種有用的手段,它使用通配符在出現在每個類中的連接點中指定一個關注。可以在TypePattern中使用合適的通配符,從切入點邏輯的余下部分中包含或排除連接點的整個包。

          package com.aspectj;

          public aspect WithinPackageRecipe {
              
          /**
               * Specifies calling advice on any join point encountered within
               * the defined scope:
               * 
               * Scope:packageA
               
          */

              pointcut withinPackageA() : within(packageA.
          *);
              
              
          //Advice declaration
              before() : withinPackageA() && !within(WithinPackageRecipe+{
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by WitinPackageRecipe()");
                  System.out.println(
          "Join Point Kind: " + thisJoinPoint.getKind());
                  System.out.println(
          "Signature: " + thisJoinPoint.getStaticPart().getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getStaticPart().getSourceLocation());
                  System.out.println(
          "-----------------------------------------");
              }


          }


           

          三. 捕獲特定方法內的所有連接點
              使用withincode(Signature)切入點。withincode(Signature)切入點的語法如下:
              pointcut <pointcut name>(<any values to be picked up>) : withincode(<modifier> <class>.<method>(<paramter types>));

              withincode(Signature)切入點有3個關鍵特征:
                  1. withincode(Signature)切入點指定了特定方法的本地作用域內的所有連接點。
                  2. withincode(Signature)切入點極少孤立使用。相反,他通常與其他切入點結合使用,用于減少將觸發附帶通知的連接點。
                  3. Signaure可以包含通配符,用于選擇不同類的不同方法上的一系列連接點。

          package com.aspectj;

          public aspect WithinMethodRecipe {
              
          /**
               * Specifies calling advice whenever a method
               * matching the following rules gets called:
               * 
               * Class Name:MyClass
               * Method Name:foo
               * Method Return Type: * (any return type)
               * Method Parameters: an int followed by a String
               
          */

              pointcut withinFooIntStringAnyReturnPointcut() : withincode(
          * MyClass.foo(int,String));
              
              
          //Advice declaration
              before() : withinFooIntStringAnyReturnPointcut() && !within(WithinMethodRecipe+{
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by withinMyClass()");
                  System.out.println(
          "Join Point Kind: " + thisJoinPoint.getKind());
                  System.out.println(
          "Signature: " + thisJoinPoint.getStaticPart().getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getStaticPart().getSourceLocation());
                  System.out.println(
          "-----------------------------------------");
              }


          }

          posted on 2008-08-25 10:32 Brian 閱讀(337) 評論(0)  編輯  收藏 所屬分類: 《AspectJ Cookbook》讀書筆記

          公告


          導航

          <2008年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 扎赉特旗| 闸北区| 和平县| 肃宁县| 宁国市| 二连浩特市| 鄄城县| 唐海县| 建瓯市| 万盛区| 东阳市| 长治市| 宁安市| 大冶市| 醴陵市| 会东县| 大荔县| 英吉沙县| 汨罗市| 安阳市| 全椒县| 宁乡县| 齐河县| 韶山市| 呼伦贝尔市| 东乌珠穆沁旗| 台东市| 那坡县| 垣曲县| 定结县| 五莲县| 定州市| 天门市| 区。| 沅陵县| 盐池县| 顺平县| 仙游县| 新郑市| 商水县| 常宁市|