做者:小傅哥
博客:https://bugstack.cnphp
沉澱、分享、成長,讓本身和他人都能有所收穫!😄
話我放這,踩過的坑越多頭髮越少!
html
說來也是奇怪,只要是學編程的,從初次接觸的 Java 到安裝 JDK、IDEA、MYSQL, 再到接觸 Spring、MyBatis、RPC、MQ,哪怕有時候在淺的坑也會跳進去嚐嚐鮮,一遍抓着頭髮,一手點着鼠標也幾乎是你的常態。你的鍵盤裏老是有不少被抓碎的頭髮!java
但,哪怕是抓了這麼頭髮,仍是遇到了一個滿腦子都是騷操做的小夥。「傅哥,個人切面怎麼攔截不到?我是照着你的《SpringBoot 中間件設計和開發》專欄寫的,你給我看看吧,我都弄了一天了」程序員
接下來我帶着你們一塊兒看看什麼是快樂星球,他是怎麼一頓騷操做讓切面攔截不到的!編程
上週,謝飛機(化名)發過來了本身的手擼的中間件源碼,說這代碼都沒有啥怎麼就不能切面呢?api
看了幾遍源碼沒發現問題,開始調試,還真它哈拉哨的不進這個切面,接下來;架構
個人目的要先讓他跑起來,在研究。接下來我把本身的工程裏的 DoJoinPoint
拷貝過來粘貼進去,噗察一下貼進去了,沒提示替換,雖然有報錯但兩個類能共存,以下:
eclipse
DoJoinPoint
不是一個正經 Java 類,路徑不對?有看不見的特殊字符?要不是IDEA把 .aj
這貨顯示成 C 類的圖標,可能早就發現問題了。緊接着把這錯誤類的截圖發給了謝飛機,問它你是怎麼建立的?他說實話了工具
DoJoinPoint
時,看到一個 Aspect 的選項,覺得這個就是建立切面的快捷操做,如圖;.aj
結尾的類,並非一個正經的 Java 類,因此切面不到,也根本沒有對應的 class 文件。AspectJ,簡稱 AJ 我本身說的開發工具
AspectJ 其實也是 AOP 的一種實現技術,功能相似於攔截器,在集成在 IntelliJ IDEA 開發工具裏。在使用 IntelliJ IDEA 編寫 AspectJ 代碼以前須要本機先安裝 AspectJ 工具包。不然你的 .aj 類不能運行,同時IDEA類顯示出來的 .aj 類,也是C的標識
接下來咱們就來聊聊關於這個東西怎麼使用,別再被 .aj 騙了。
在使用 AspectJ 以前,須要去官網下載一個安裝包,地址:https://www.eclipse.org/aspectj/downloads.php 若是官網下載的很慢,能夠從我提供的源碼中獲取,也能夠從其餘途徑搜索下載 aspectj-1.9.4.jar
下載完成安裝;
java -jar aspectj-1.9.4.jar
C:\aspectj1.9
,包括:bin、doc、lib等,後面咱們就會使用到這些內容。在專業版 IDEA 中開發 AspectJ,須要安裝如下兩個插件:
開始以前須要在項目中添加 aspectjrt.jar
依賴,aspectjrt.jar
即 AspectJ 安裝目錄中lib
目錄下的jar包。你能夠複製到工程中引入,也能夠直接引入
Project Structure
IDEA 默認使用 javac
編譯器,這裏須要配置 AspectJ 的編譯器 ajc
,在 IDEA 中作相應配置。
C:\aspectj1.9\lib\aspectjtools.jar
建立 Aspect 類
public aspect DoAspect { pointcut logPointcut():call(* ApiTest.hi(..)); void around():call(void ApiTest.hi(..)){ System.out.println("call 開始..."); proceed(); System.out.println("call 結束..."); } before(): logPointcut(){ System.out.println("方法執行 before"); } after(): logPointcut(){ System.out.println("方法執行 after"); } }
測試類
public class ApiTest { public void hi(){ System.out.println("Hi Aspect"); } public static void main(String[] args) { ApiTest apiTest = new ApiTest(); apiTest.hi(); } }
測試結果
call 開始... 方法執行 before Hi Aspect call 結束... 方法執行 after Process finished with exit code 0