掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
話我放這,踩過的坑越多頭發(fā)越少!

創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)公司、成都網(wǎng)站制作、網(wǎng)站營銷推廣、網(wǎng)站開發(fā)設(shè)計,對服務(wù)成都發(fā)電機維修等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗。創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司成立于2013年,提供專業(yè)網(wǎng)站制作報價服務(wù),我們深知市場的競爭激烈,認真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進步,是我們永遠的責任!
說來也是奇怪,只要是學編程的,從初次接觸的 Java 到安裝 JDK、IDEA、MYSQL, 再到接觸 Spring、MyBatis、RPC、MQ,哪怕有時候在淺的坑也會跳進去嘗嘗鮮,一遍抓著頭發(fā),一手點著鼠標也幾乎是你的常態(tài)。你的鍵盤里總是有很多被抓碎的頭發(fā)!
但,哪怕是抓了這么頭發(fā),還是遇到了一個滿腦子都是騷操作的小伙。“傅哥,我的切面怎么攔截不到?我是照著你的《SpringBoot 中間件設(shè)計和開發(fā)》專欄寫的,你給我看看吧,我都弄了一天了”
接下來我?guī)е蠹乙黄鹂纯词裁词强鞓沸乔?,他是怎么一頓騷操作讓切面攔截不到的!
上周,謝飛機(化名)發(fā)過來了自己的手擼的中間件源碼,說這代碼都沒有啥怎么就不能切面呢?
最開始我大意了,讓謝飛機發(fā)了一些代碼截圖。
看截圖的代碼,這完全就和我寫的中間件里的代碼一毛一樣,沒啥問題呀,包路徑也能掃描到,咋就不能切面了?
我說你打個斷點調(diào)試下,看看怎么切不到了呢?嘿,調(diào)試了,直接通過,就是沒切面到。
此時我思考了JDK版本、環(huán)境配置、Spring上下文、切面的定義、包的路徑以及這小子是否忽悠我?
最后我抱著這小子忽悠我的心里,把源碼要過來了。
看了幾遍源碼沒發(fā)現(xiàn)問題,開始調(diào)試,還真它哈拉哨的不進這個切面,接下來;
謝飛機的源碼保留,復(fù)制出來一份新的。
我的目的要先讓他跑起來,在研究。接下來我把自己的工程里的 DoJoinPoint拷貝過來粘貼進去,噗察一下貼進去了,沒提示替換,雖然有報錯但兩個類能共存,如下:這就神奇了哈,我當時懷疑是不它那 DoJoinPoint不是一個正經(jīng) Java 類,路徑不對?有看不見的特殊字符?
既然發(fā)現(xiàn)這個類不對,那行先刪掉。讓程序先跑起來,確保除了這個類其他的內(nèi)容沒有問題,這樣也好排查問題。
還別說,去掉這個錯誤類,程序可以正常運行,攔截到切面內(nèi)容了。
既然程序能跑了,我就想著這可以看看問題出在哪了,沒想到就只打開個文件夾,就發(fā)現(xiàn)了一個神奇的AJ!這貨壓根就不是 Java 類!
要不是IDEA把 .aj 這貨顯示成 C 類的圖標,可能早就發(fā)現(xiàn)問題了。緊接著把這錯誤類的截圖發(fā)給了謝飛機,問它你是怎么創(chuàng)建的?他說實話了
謝飛機先說自己偷懶了,哈哈哈,讓人怪不好意思的!
他說在創(chuàng)建 DoJoinPoint時,看到一個 Aspect 的選項,以為這個就是創(chuàng)建切面的快捷操作,如圖;
創(chuàng)建完成以后發(fā)現(xiàn)有點不對,不是 class 類型的,是個 aspect,于是他手動把 aspect 改成了 class,如圖;
所以,謝飛機實際創(chuàng)建出來的是一個 aspect 的以 .aj結(jié)尾的類,并不是一個正經(jīng)的 Java 類,所以切面不到,也根本沒有對應(yīng)的 class 文件。
AspectJ,簡稱 AJ 我自己說的
AspectJ 其實也是 AOP 的一種實現(xiàn)技術(shù),功能類似于攔截器,在集成在 IntelliJ IDEA 開發(fā)工具里。在使用 IntelliJ IDEA 編寫 AspectJ 代碼之前需要本機先安裝 AspectJ 工具包。否則你的 .aj 類不能運行,同時IDEA類顯示出來的 .aj 類,也是C的標識
接下來我們就來聊聊關(guān)于這個東西怎么使用,別再被 .aj 騙了。
在使用 AspectJ 之前,需要去官網(wǎng)下載一個安裝包,地址:https://www.eclipse.org/aspectj/downloads.php 如果官網(wǎng)下載的很慢,可以從我提供的源碼中獲取,也可以從其他途徑搜索下載 aspectj-1.9.4.jar
下載完成安裝;
默認配置安裝完成以后會在C盤創(chuàng)建出一個文件夾 C:\aspectj1.9,包括:bin、doc、lib等,后面我們就會使用到這些內(nèi)容。
在專業(yè)版 IDEA 中開發(fā) AspectJ,需要安裝以下兩個插件:
Spring AOP/@AspectJ
AspectJ Support
開始之前需要在項目中添加 aspectjrt.jar 依賴,aspectjrt.jar 即 AspectJ 安裝目錄中l(wèi)ib目錄下的jar包。你可以復(fù)制到工程中引入,也可以直接引入
在工程上鼠標右鍵,點擊 Open Module Setting 打開 Project Structure
點擊 Libraries 選項卡,和上面的 + 號,創(chuàng)建 New Project Library
選擇 C:\aspectj1.9\lib\aspectjrt.jar路徑,點擊即可配置完成
IDEA 默認使用 javac 編譯器,這里需要配置 AspectJ 的編譯器 ajc,在 IDEA 中做相應(yīng)配置。
打開 IDEA -> File -> Settings對話
選擇 Build,Execution,Deployment -> Compiler -> Java Compiler
Use complier:選擇 Ajc
在 Path to aspectjtools.jar里配置路徑C:\aspectj1.9\lib\aspectjtools.jar
創(chuàng)建 Aspect 類
public aspect DoAspect {
pointcut logPointcut():call(* ApiTest.hi(..));
void around():call(void ApiTest.hi(..)){
System.out.println("call 開始...");
proceed();
System.out.println("call 結(jié)束...");
}
before(): logPointcut(){
System.out.println("方法執(zhí)行 before");
}
after(): logPointcut(){
System.out.println("方法執(zhí)行 after");
}
}測試類
public class ApiTest {
public void hi(){
System.out.println("Hi Aspect");
}
public static void main(String[] args) {
ApiTest apiTest = new ApiTest();
apiTest.hi();
}
}測試結(jié)果
call 開始...
方法執(zhí)行 before
Hi Aspect
call 結(jié)束...
方法執(zhí)行 after
Process finished with exit code 0
到這,才是一個關(guān)于 Aspect 類的正確打開方式,關(guān)于 Aspect 的使用也可以嘗試搞搞,此篇還只是關(guān)于此類切面寫法的一個入門。
你的代碼越粗獷、越豪放、越騷氣,幾乎你遇到的問題也是越多的,可能就是因為沒有遵守一定的研發(fā)執(zhí)行規(guī)范,所以遇到的這些有點傻的問題,幾乎會浪費掉你一個上午或者一天。
但有些時候如果你能認真對待你弄出來的bug,深入分析下它是如何產(chǎn)生的,并把它復(fù)現(xiàn)出來一點點深入研究下,可能也會得到意想不到的收獲,也說不定。所以凡是認真,凡事沒有壞事。
關(guān)于切面、關(guān)于源碼、關(guān)于開發(fā),可能并不應(yīng)該只注重于功能實現(xiàn),甚至有時候要想辦法逃離日復(fù)一日沒有成長的工作內(nèi)容。多在那些有價值的技術(shù)上下功夫,那你的收獲也是最多的。?

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流