1. 程式人生 > >AOP 切入點表示式

AOP 切入點表示式

8.切入點表示式

  現在我們介紹一下最重要的切入點表示式:

  如上文所說,定義切入點時需要一個包含名字和任意引數的簽名,還有一個切入點表示式,就是* findById*(..)這一部分。

  切入點表示式的格式:execution([可見性] 返回型別 [宣告型別].方法名(引數) [異常])

  其中【】中的為可選,其他的還支援萬用字元的使用:

    *:匹配所有字元
      ..:一般用於匹配多個包,多個引數
      +:表示類及其子類

  運算子有:&&、||、!

  

切入點表示式關鍵詞:   

    1)execution:用於匹配子表示式。

            //匹配com.cjm.model包及其子包中所有類中的所有方法,返回型別任意,方法引數任意
            @Pointcut("execution(* com.cjm.model..*.*(..))")
            public void before(){}

 

      2)within:用於匹配連線點所在的Java類或者包。

            //匹配Person類中的所有方法
            @Pointcut("within(com.cjm.model.Person)")
            public void before(){}

 

            //匹配com.cjm包及其子包中所有類中的所有方法

            @Pointcut("within(com.cjm..*)")
            public void before(){}

 

     3) this:用於向通知方法中傳入代理物件的引用。
            @Before("before() && this(proxy)")
            public void beforeAdvide(JoinPoint point, Object proxy){
                  //處理邏輯
            }

 

      4)target:用於向通知方法中傳入目標物件的引用。
            @Before("before() && target(target)
            public void beforeAdvide(JoinPoint point, Object proxy){
                  //處理邏輯
            }

 

      5)args:用於將引數傳入到通知方法中。
            @Before("before() && args(age,username)")
            public void beforeAdvide(JoinPoint point, int age, String username){
                  //處理邏輯
            }
 
      6)@within :用於匹配在類一級使用了引數確定的註解的類,其所有方法都將被匹配。 

            @Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation標註的類都將匹配
            public void before(){}

  

      7)@target :和@within的功能類似,但必須要指定註解介面的保留策略為RUNTIME。
            @Pointcut("@target(com.cjm.annotation.AdviceAnnotation)")
            public void before(){}

 

      8)@args :傳入連線點的物件對應的Java類必須被@args指定的Annotation註解標註。
            @Before("@args(com.cjm.annotation.AdviceAnnotation)")
            public void beforeAdvide(JoinPoint point){
                  //處理邏輯
            }

  

      9)@annotation :匹配連線點被它引數指定的Annotation註解的方法。也就是說,所有被指定註解標註的方法都將匹配。
            @Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)")
            public void before(){}

      10)bean:通過受管Bean的名字來限定連線點所在的Bean。該關鍵詞是Spring2.5新增的。
            @Pointcut("bean(person)")
            public void before(){}