- 以下內容只提供 關於Aop 使用的業務場景的思考及 關於Spring aop Around 環繞增強的一部分簡單使用介紹,如果想要看Spring aop 如何使用的請移步spring 官網 查看使用文檔
我們時常會遇到這樣的場景。
1.當業務邏輯模塊已經寫完,卻又突發的想要在這個已經完成了一階段的邏輯上,進一步處理。
2.當我們的項目數據庫結構已經設計完成,並已投入使用一段時間。但這時,我們有需要讓我們的項目去對接外部接口。這時就會出現,【語義】上的偏差。說白了,就是我們的A字段 和接口出來的 B字段 其實是同一個意義上的值,但卻無法直接使用。(我叫身份證爲a ,小明叫身份證爲b,明明都是身份證,卻有2種說法,b在某種意義上是不能被我直接當成身份證來用的,我們必須把b 轉爲 a 才能在我這裏當成身份證)。這時候呢。要怎麼處理。
我原先是想說寫成一個適配器,就是做一下簡單的轉譯處理。
寫一個類,專門做這種特定的處理。在需要轉譯的地方,我們引入這個類,例如這樣
List<String> a = ...... //a 是未處理過得知
List<String> b = change(a) //經過chane處理後 轉爲了 b
但後來一想,這樣做,其實對原先的代碼會存在類的侵入性。不是很友好且優雅。
這時候,我就發現了,其實所有做的這些事,無非就是在原先的基礎上做 【拓展】,在衍生一下
其實就是面向切面所說的那樣,【增強處理】。
那就優雅了!
使用Spring aop 對這塊邏輯 進行【增強處理】!
這裏有一點需要強調!!!!!
Aop 的 增強 其實很需要我們的代碼質量高及業務邏輯分解度高。因爲只有這樣的代碼塊,才能對其增強。你不可能要求aop在每行代碼上下進行邏輯【增強】的。
所以,小夥伴們,一定要對自己的代碼質量及封裝,抽象能力,業務模塊劃分能力提高要求。
關於Spring aop 具體的各類使用 我這裏就不具體列舉了。建議大家去看文檔,網上的代碼亂又雜,文檔還是最清晰的。。
我這裏就提一個 【環繞增強 @Around】的處理
我們使用Aop 除了 日常的權限控制,日誌記錄,等一些常規用法外。
還會經常碰到這樣一個事情,例如我想 【轉譯】!
什麼叫【轉譯】呢??
在列舉一個常況。
我從外部接口獲取到這樣這個接口數據格式
[{ "uuid":"123","userName":"小明","sex":"男"}]
我們想要把這個數據插入我們的數據庫,或是映射在我們的前端頁面上。
但!我們的庫表結構 是這樣的 name 代表 username usersex 代表 sex
這時候怎麼辦???
很多小夥伴會說,直接改唄。是的。這也是行的。但是!如果我們很多頁面上都使用了 name 去映射信息。而全局替換的方式風險又很大。這時候如何降低風險。沒錯,就是使用【轉譯】。
我們把我們的項目想象成一個容器!我們已經把容器的內容都做好了。但,就因爲要對接外部參數,就該全部更新一遍我們的容器內部實現嗎??肯定是不合理的。這樣的工作是在浪費時間。
那我們就這樣,在容器外面裹一層濾網,對所有想要進入我們項目的數據進行預處理 【轉譯】!!!
這樣,我們就不需要改變內部實現,轉成我們內部能解析的格式就行了。
而!Around 就很符合這個思想。
我們的容器肯定不是遊離與體系之外的,肯定是與其它項目進行溝通的。那就肯定會出數據的雙向流動。
需要對接口進行前後【轉譯增強】!!!,那就意味着我們會對入參和結果返回值進行更改,那就只能使用到Aop 的Around 環繞增強了。
後面就貼一部分代碼實例吧。
//僞代碼,根據自己的業務需求使用
@Around("execution(* 。。。。攔截的方法路徑(..)) && args(。。。參數名1,參數名2)")
public Object outerCheckMetaDmodAdapter(ProceedingJoinPoint joinPoint,參數名1,參數名2) throws Throwable{
//進入方法前的增強處理,攔截方法的參數可以從joinPoint 內取出
Object result = joinPoint.proceed(new Object[] {(beforeHandler((Map<String,Object>)object)),pageNum,pageSize});
//result => 方法的返回結果
//方法返回結果後的增強處理
List<Map<String,Object>> params = (List<Map<String,Object>>)result;
return afterHandler(params);
}