使用AOP實現引數驗證

2021-08-30 08:34:43 字數 2117 閱讀 2272

今天,我們使用aop來開發乙個引數驗證。

首先,我們理理這個引數驗證的原理以及流程。

第一步,我們會定義乙個註解,這個註解可以被用來修飾某一方法的引數,如下:

public object login(@requestbody @customvalid logindto logindto, httpsession session)
這裡的@customvalid就是我們的自定義註解。

它的**如下:

@retention(retentionpolicy.runtime)

@target(elementtype.parameter)

public @inte***ce customvalid

第二步,我們會在切入點的環繞通知中獲取所有的方法引數:

//獲取所有的方法引數

signature signature = joinpoint.getsignature();

methodsignature methodsignature = (methodsignature)signature;

method targetmethod = methodsignature.getmethod();

parameter parameters=targetmethod.getparameters();

通過這一句**來獲取需要驗證的方法引數型別:

listlist=validationprocessor.getvalidateclass(parameters);
其內部實現:

public listgetvalidateclass(parameter parameters)}}

return list;

}

原理就是通過反射獲取引數陣列中各個引數上的註解,並判斷是否有@customvalid這個註解,如果有就加入列表,最終返回。

第三步,獲取到需要驗證的引數型別之後,我們進行雙重迴圈,找出需要進行引數驗證的引數物件:

for (object arg : joinpoint.getargs()) 

} catch (illegalacces***ception e) }}

}

這裡validationprocessor有乙個valid方法,該方法通過引數物件的所有成員變數,並取出每個成員變數上的註解,進一步進行驗證,**如下:

public validresult valid(field fields, object target) throws illegalacces***ception }}

}return new validresult(true);

}

其中,每乙個驗證註解都會實現乙個validinte***ce介面,**如下:

public inte***ce validinte***ce
當驗證器進行驗證的話,valid方法會被呼叫,如果驗證通過,返回true 反之false。

geterrormessage 則是返回驗證失敗後的提示資訊。 

這是validresult的**:

public class validresult 

public validresult(boolean isvalid)

}

其主要職責就是存放驗證結果。

這樣,乙個完整的引數驗證流程就完成了,讓我們來總結一下:

1.迴圈判斷引數是否含有@customvalid註解,若有則進行下一步,否則退出。

2.取出含有@customvalid註解的引數物件,取出其所有的成員變數。

3.迴圈獲得每個成員變數上的註解,若在驗證處理器內部擁有註冊,則呼叫這個驗證註解提供的驗證介面。

4.返回驗證結果,讓切入點的環繞通知決定下一步結果。

不完美的地方:

在這裡,我們通過手工的方式進行了驗證介面的註冊:

這個做法在我看來,是不夠完美的,我想是否可以運用多型或者繼承,來實現驗證註解與驗證處理介面的聯絡?而非這樣進行手工註冊。

這裡是乙個需要思考的地方。

aop阻止方法執行 Aop實現攔截方法引數

對於spring框架來說,最重要的兩大特性就是aop 和ioc。以前一直都知道有這兩個東西,在平時做的專案中也常常會涉及到這兩塊,像spring的事務管理什麼的,在看了些原始碼後,才知道原來事務管理也是用的aop來實現的。對於ioc的話,平時接觸的就更多了,什麼autowired,resource各...

使用註解實現AOP

xml標頭檔案中加入 xmlns context xsi schemalocation spring context.xsd 宣告哪些包下有註解 當有兩個以上的包時,用 隔開 在demo類中加入 component 在方法上新增 pointcut 定義切點 component public clas...

使用註解實現AOP

1.匯入jar包 與用介面實現 的jar包相同 2.配置 a.將業務類和通知類納入springioc容器 b.在容器中開啟註解對aop的支援 c.將類使用註解方式 component 放入ioc容器中時,要將該類所在的包新增到掃瞄器中 3.編寫通知類 1.加入註解 aspect,不用再實現介面 但是...