
作者:小傅哥
部落格:https://bugstack.cn
沉澱、分享、成長,讓自己和他人都能有所收獲!😄
一、前言
話我放這,踩過的坑越多頭發越少!
說來也是奇怪,隻要是學程式設計的,從初次接觸的 Java 到安裝 JDK、IDEA、MYSQL, 再到接觸 Spring、MyBatis、RPC、MQ,哪怕有時候在淺的坑也會跳進去嘗嘗鮮,一遍抓着頭發,一手點着滑鼠也幾乎是你的常态。你的鍵盤裡總是有很多被抓碎的頭發!
但,哪怕是抓了這麼頭發,還是遇到了一個滿腦子都是騷操作的小夥。“傅哥,我的切面怎麼攔截不到?我是照着你的《SpringBoot 中間件設計和開發》專欄寫的,你給我看看吧,我都弄了一天了”
接下來我帶着大家一起看看什麼是快樂星球,他是怎麼一頓騷操作讓切面攔截不到的!
二、滿腦子都是騷操作
1. 遇到問題
上周,謝飛機(化名)發過來了自己的手撸的中間件源碼,說這代碼都沒有啥怎麼就不能切面呢?
- 最開始我大意了,讓謝飛機發了一些代碼截圖。
- 看截圖的代碼,這完全就和我寫的中間件裡的代碼一毛一樣,沒啥問題呀,包路徑也能掃描到,咋就不能切面了?
- 我說你打個斷點調試下,看看怎麼切不到了呢?嘿,調試了,直接通過,就是沒切面到。
- 此時我思考了JDK版本、環境配置、Spring上下文、切面的定義、包的路徑以及這小子是否忽悠我?
- 最後我抱着這小子忽悠我的心裡,把源碼要過來了。
2. 發現問題
看了幾遍源碼沒發現問題,開始調試,還真它哈拉哨的不進這個切面,接下來;
- 謝飛機的源碼保留,複制出來一份新的。
- 我的目的要先讓他跑起來,在研究。接下來我把自己的工程裡的
拷貝過來粘貼進去,噗察一下貼進去了,沒提示替換,雖然有報錯但兩個類能共存,如下:DoJoinPoint
一個Bug,讓我發現了 Java 界的.AJ(錐)! - 這就神奇了哈,我當時懷疑是不它那
不是一個正經 Java 類,路徑不對?有看不見的特殊字元?DoJoinPoint
- 這就神奇了哈,我當時懷疑是不它那
- 既然發現這個類不對,那行先删掉。讓程式先跑起來,確定除了這個類其他的内容沒有問題,這樣也好排查問題。
- 還别說,去掉這個錯誤類,程式可以正常運作,攔截到切面内容了。
- 既然程式能跑了,我就想着這可以看看問題出在哪了,沒想到就隻打開個檔案夾,就發現了一個神奇的AJ!這貨壓根就不是 Java 類!
一個Bug,讓我發現了 Java 界的.AJ(錐)!
3. 排查問題
要不是IDEA把
.aj
這貨顯示成 C 類的圖示,可能早就發現問題了。緊接着把這錯誤類的截圖發給了謝飛機,問它你是怎麼建立的?他說實話了
- 謝飛機先說自己偷懶了,哈哈哈,讓人怪不好意思的!
- 他說在建立
時,看到一個 Aspect 的選項,以為這個就是建立切面的快捷操作,如圖;DoJoinPoint
一個Bug,讓我發現了 Java 界的.AJ(錐)! - 建立完成以後發現有點不對,不是 class 類型的,是個 aspect,于是他手動把 aspect 改成了 class,如圖;
一個Bug,讓我發現了 Java 界的.AJ(錐)! - 是以,謝飛機實際建立出來的是一個 aspect 的以
結尾的類,并不是一個正經的 Java 類,是以切面不到,也根本沒有對應的 class 檔案。.aj
三、如何正确使用 Aspect 的 .aj 類
AspectJ,簡稱 AJ 我自己說的
AspectJ 其實也是 AOP 的一種實作技術,功能類似于攔截器,在內建在 IntelliJ IDEA 開發工具裡。在使用 IntelliJ IDEA 編寫 AspectJ 代碼之前需要本機先安裝 AspectJ 工具包。否則你的 .aj 類不能運作,同時IDEA類顯示出來的 .aj 類,也是C的辨別
接下來我們就來聊聊關于這個東西怎麼使用,别再被 .aj 騙了。
1. 安裝 AspectJ
在使用 AspectJ 之前,需要去官網下載下傳一個安裝包,位址:https://www.eclipse.org/aspectj/downloads.php 如果官網下載下傳的很慢,可以從我提供的源碼中擷取,也可以從其他途徑搜尋下載下傳 aspectj-1.9.4.jar
下載下傳完成安裝;
- 輕按兩下安裝
- 指令安裝
java -jar aspectj-1.9.4.jar
- 配置說明:沒有配置,傻瓜式下一步就可以了
- 預設配置安裝完成以後會在C槽建立出一個檔案夾
,包括:bin、doc、lib等,後面我們就會使用到這些内容。C:\aspectj1.9
2. AspectJ 插件
在專業版 IDEA 中開發 AspectJ,需要安裝以下兩個插件:
- Spring AOP/@AspectJ
- AspectJ Support
3. 添加依賴 aspectjrt.jar
開始之前需要在項目中添加
aspectjrt.jar
依賴,
aspectjrt.jar
即 AspectJ 安裝目錄中
lib
目錄下的jar包。你可以複制到工程中引入,也可以直接引入
- 在工程上滑鼠右鍵,點選 Open Module Setting 打開
Project Structure
- 點選 Libraries 頁籤,和上面的 + 号,建立 New Project Library
- 選擇 C:\aspectj1.9\lib\aspectjrt.jar 路徑,點選即可配置完成
4. 配置AspectJ編譯器
IDEA 預設使用
javac
編譯器,這裡需要配置 AspectJ 的編譯器
ajc
,在 IDEA 中做相應配置。
- 打開 IDEA -> File -> Settings 對話
- 選擇 Build,Execution,Deployment -> Compiler -> Java Compiler
- Use complier:選擇 Ajc
- 在 Path to aspectjtools.jar 裡配置路徑
C:\aspectj1.9\lib\aspectjtools.jar
5. 案例測試
建立 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
- 到這,才是一個關于 Aspect 類的正确打開方式,關于 Aspect 的使用也可以嘗試搞搞,此篇還隻是關于此類切面寫法的一個入門。
四、總結
- 你的代碼越粗犷、越豪放、越騷氣,幾乎你遇到的問題也是越多的,可能就是因為沒有遵守一定的研發執行規範,是以遇到的這些有點傻的問題,幾乎會浪費掉你一個上午或者一天。
- 但有些時候如果你能認真對待你弄出來的bug,深入分析下它是如何産生的,并把它複現出來一點點深入研究下,可能也會得到意想不到的收獲,也說不定。是以凡是認真,凡事沒有壞事。
- 關于切面、關于源碼、關于開發,可能并不應該隻注重于功能實作,甚至有時候要想辦法逃離日複一日沒有成長的工作内容。多在那些有價值的技術上下功夫,那你的收獲也是最多的。
五、系列推薦
- 工作兩三年了,整不明白架構圖都畫啥?
- 半年招聘篩選了400+份履歷,告訴你怎麼寫容易被撩!
- 數學,離一個程式員有多近?
- 握草,你竟然在代碼裡下毒!
- 工作兩年履歷寫成這樣,誰要你呀!
公衆号:bugstack蟲洞棧 | 作者小傅哥多年從事一線網際網路 Java 開發的學習曆程技術彙總,旨在為大家提供一個清晰詳細的學習教程,側重點更傾向編寫Java核心内容。如果能為您提供幫助,請給予支援(關注、點贊、分享)!