關於Spring aop的思考及使用

  • 以下內容只提供 關於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);
       }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章