使用AOP實現參數驗證

今天,我們使用AOP來開發一個參數驗證。

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

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

使用AOP實現參數驗證

這裡的@CustomValid就是我們的自定義註解。

它的代碼如下:

使用AOP實現參數驗證

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

使用AOP實現參數驗證

通過這一句代碼來獲取需要驗證的方法參數類型:

List<class> list=validationProcessor.getValidateClass(parameters);
/<class>

其內部實現:

使用AOP實現參數驗證

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

第三步,獲取到需要驗證的參數類型之後,我們進行雙重循環,找出需要進行參數驗證的參數對象:

使用AOP實現參數驗證

這裡validationProcessor有一個valid方法,該方法通過參數對象的所有成員變量,並取出每個成員變量上的註解,進一步進行驗證,代碼如下:

使用AOP實現參數驗證

這裡面有一個validMapping對象,該map維護驗證註解與內部驗證類的映射關係:

使用AOP實現參數驗證

其中,每一個驗證註解都會實現一個ValidInterface接口,代碼如下:

使用AOP實現參數驗證

當驗證器進行驗證的話,valid方法會被調用,如果驗證通過,返回true 反之false。

getErrorMessage 則是返回驗證失敗後的提示信息。

這是ValidResult的代碼:

使用AOP實現參數驗證

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

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

1.循環判斷參數是否含有@CustomValid註解,若有則進行下一步,否則退出。

2.取出含有@CustomValid註解的參數對象,取出其所有的成員變量。

3.循環獲得每個成員變量上的註解,若在驗證處理器內部擁有註冊,則調用這個驗證註解提供的驗證接口。

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

不完美的地方:

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

使用AOP實現參數驗證

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

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


分享到:


相關文章: