天天看點

SpringAop中的Pointcut、ClassFilter、MethodMatcher接口的定義

Pointcut接口的定義:

public interface Pointcut{
	ClassFilter getClassFilter();
	MethodMatcher getMethodMatcher();
	Pointcut TRUE =  TruePointcut.INSTANCE;
}
           

ClassFilter接口的定義:

public interface ClassFilter{
	boolean getClassFilter(Class clazz);
	ClassFilter TRUE = TrueClassFilter.INSTANCE;
}
           

MethodMatcher接口的定義:

public interface MethodMatcher{
	boolean matches(Method method, Class targetClass);
	boolean isRuntime();
	boolean matches(Method method, Class targetClass, Object[] args);
	MethodMatcher TRUE = TrueMethodMatcher.INSTACNE;
}
           

Pointcut接口作為SpringAop中對AOP的最頂層抽象,主要負責對系統的相應的Joinpoint進行捕捉,并且提供了一個TruePointcut執行個體,當Pointcut為TruePointcut類型時,則會忽略所有的比對條件,對系統中所有的對象進行Joinpoint所定義的規則進行比對;

ClassFilter與MethodMatcher分别用于在不同的級别上限定Joinpoint的比對範圍,滿足不同粒度的比對,ClassFilter限定在類級别上,MethodMatcher限定在方法級别上;但是SpringAop主要支援在方法級别上的比對,是以對類級别的比對支援相對簡單一些;

當傳入的clazz與Pointcut規定的類型一緻時,則傳回true,否則傳回false,傳回為true時,則表示對這個類進行植入操作,當類型對Joinpoint的比對不産生影響的時候,可以讓Pointcut接口中的ClassFilter getClassFilter()方法直接傳回TrueClassFilter.INSTANCE,則表示對系統中的所有對象進行Joinpoint比對;

MethodMatcher接口通過重載定義了兩個matches()方法,兩個參數的matches()被稱為靜态比對,在比對條件不是太嚴格時使用,可以滿足大部分場景的使用,稱之為靜态的主要是區分為三個參數的matches()方法需要在運作時動态的對參數的類型進行比對;兩個方法的分界線就是boolean isRuntime()方法,進行比對時先用兩個參數的matches()方法進行比對,若比對成功,則檢查boolean isRuntime()的傳回值,若為true,則調用三個參數的matches()方法進行比對(若兩個參數的都比對不中,三個參數的必定比對不中),比如需要統計使用者登入次數時,那麼登入傳入的參數就是可以忽略的,則調用兩個參數的matches()方法就已經足夠了,但是若要在登陸時對使用者賬号執行特殊的操作(如賦予特殊的操作權限),就需要對參數進行一個類似于檢驗的操作,就需要調用三個參數的matches()進行比對。

繼續閱讀