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(){}