厲害了!老大利用AOP實現自定義註解,半小時完成我三天工作量

前面我們已經介紹了AOP適用的一些業務場景以及簡單的代碼實現,當時我們的切點是用execution

表達式來配置的,這種方式有一些侷限性在裡面:

  • 靈活性不高,一個表達式只能切到某種同類型的方法
  • 個性化不足,很難對切面切到的所有方法中的一些做一些個性化的設置

這讓我想起有以前我還是一個菜鳥時接到的一個需求,要在所有接口中記錄請求日誌,因為項目比較老了,所以接口還是挺多的,我預估需要三天才能完成,我們老大鄙視了我一眼,然後花半小時就完成了。

今天我們就來講講切點的另一種配置方式:@annotation,通過@annotation配置切點,我們可以靈活的控制切到哪個方法,同時可以進行一些個性化的設置,今天我們就用它來實現一個記錄所有接口請求功能吧。

首先來看看我們要實現的效果

厲害了!老大利用AOP實現自定義註解,半小時完成我三天工作量

通過結果我們可以看到,我們的自定義註解EagleEye做到了統一的記錄下了請求鏈接、請求類型、請求IP、請求入參、請求耗時、請求返回等信息。

是不是感覺還不錯呢?下面我們就來一起動手實現它吧!

添加依賴

新建一個Spring Boot項目,打開pom.xml文件添加相關Maven依賴:

厲害了!老大利用AOP實現自定義註解,半小時完成我三天工作量

自定義一個註解

我們定義了一個註解,定義註解使用@interface:

厲害了!老大利用AOP實現自定義註解,半小時完成我三天工作量

  1. 定義了註解的生命週期為運行時
  2. 定義了註解的作用域為方法
  3. 標識該註解可以被JavaDoc記錄
  4. 定義註解名稱為EagleEye(鷹眼,哈哈~~)
  5. 定義一個元素desc,用來描述被修飾的方法

註解雖然定義好了,但是還用不了,因為沒有具體的實現邏輯,接下來我們用AOP實現它。

配置AOP切面

首先我們定義切點:

厲害了!老大利用AOP實現自定義註解,半小時完成我三天工作量

我們通過@annotation來配置切點,代表我們的AOP切面會切到所有用EagleEye註解修飾的類。

接下來我們利用@Around環繞增強來實現我們的功能:

厲害了!老大利用AOP實現自定義註解,半小時完成我三天工作量

  1. 首先我們先記錄請求鏈接、接口描述、請求類型、請求IP、請求入參信息
  2. 接著執行我們註解切到的原方法邏輯
  3. 最後我們記錄整個請求耗時、返回結果

OK,到這裡,我們就完成了利用AOP自定義註解的所有步驟。

怎麼使用自定義註解?

修飾Controller裡的接口方法:

厲害了!老大利用AOP實現自定義註解,半小時完成我三天工作量

修飾Service裡的方法:

厲害了!老大利用AOP實現自定義註解,半小時完成我三天工作量

對於需要AOP增強的方法,我們只需要:

  1. 在方法上加上@EagleEye註解
  2. 通過desc元素設置方法的描述

接下來啟動應用,請求接口看一下控制檯輸出是不是像我們開頭貼出的那樣吧。

總結

當然,這僅僅是自定義註解的一種小用法而已,其他比如實現接口的自動加解密、權限過濾等更多實用功能,都會出現在後面的文章中。


分享到:


相關文章: