一個Bug,讓我發現了 Java 界的.AJ(錐)!

做者:小傅哥
博客:https://bugstack.cnphp

沉澱、分享、成長,讓本身和他人都能有所收穫!😄

1、前言

話我放這,踩過的坑越多頭髮越少!html

說來也是奇怪,只要是學編程的,從初次接觸的 Java 到安裝 JDK、IDEA、MYSQL, 再到接觸 Spring、MyBatis、RPC、MQ,哪怕有時候在淺的坑也會跳進去嚐嚐鮮,一遍抓着頭髮,一手點着鼠標也幾乎是你的常態。你的鍵盤裏老是有不少被抓碎的頭髮!java

但,哪怕是抓了這麼頭髮,仍是遇到了一個滿腦子都是騷操做的小夥。「傅哥,個人切面怎麼攔截不到?我是照着你的《SpringBoot 中間件設計和開發》專欄寫的,你給我看看吧,我都弄了一天了」程序員

接下來我帶着你們一塊兒看看什麼是快樂星球,他是怎麼一頓騷操做讓切面攔截不到的!編程

2、滿腦子都是騷操做

1. 遇到問題

上週,謝飛機(化名)發過來了本身的手擼的中間件源碼,說這代碼都沒有啥怎麼就不能切面呢?api

  • 最開始我大意了,讓謝飛機發了一些代碼截圖。
  • 看截圖的代碼,這徹底就和我寫的中間件裏的代碼一毛同樣,沒啥問題呀,包路徑也能掃描到,咋就不能切面了?
  • 我說你打個斷點調試下,看看怎麼切不到了呢?嘿,調試了,直接經過,就是沒切面到。
  • 此時我思考了JDK版本、環境配置、Spring上下文、切面的定義、包的路徑以及這小子是否忽悠我?
  • 最後我抱着這小子忽悠個人內心,把源碼要過來了。

2. 發現問題

看了幾遍源碼沒發現問題,開始調試,還真它哈拉哨的不進這個切面,接下來;架構

  • 謝飛機的源碼保留,複製出來一份新的。
  • 個人目的要先讓他跑起來,在研究。接下來我把本身的工程裏的 DoJoinPoint 拷貝過來粘貼進去,噗察一下貼進去了,沒提示替換,雖然有報錯但兩個類能共存,以下:
    eclipse

    • 這就神奇了哈,我當時懷疑是不它那 DoJoinPoint 不是一個正經 Java 類,路徑不對?有看不見的特殊字符?
  • 既然發現這個類不對,那行先刪掉。讓程序先跑起來,確保除了這個類其餘的內容沒有問題,這樣也好排查問題。
  • 還別說,去掉這個錯誤類,程序能夠正常運行,攔截到切面內容了。
  • 既然程序能跑了,我就想着這能夠看看問題出在哪了,沒想到就只打開個文件夾,就發現了一個神奇的AJ!這貨壓根就不是 Java 類!

3. 排查問題

要不是IDEA把 .aj 這貨顯示成 C 類的圖標,可能早就發現問題了。緊接着把這錯誤類的截圖發給了謝飛機,問它你是怎麼建立的?他說實話了工具

  • 謝飛機先說本身偷懶了,哈哈哈,讓人怪很差意思的!
  • 他說在建立 DoJoinPoint 時,看到一個 Aspect 的選項,覺得這個就是建立切面的快捷操做,如圖;
  • 建立完成之後發現有點不對,不是 class 類型的,是個 aspect,因而他手動把 aspect 改爲了 class,如圖;
  • 因此,謝飛機實際建立出來的是一個 aspect 的以 .aj 結尾的類,並非一個正經的 Java 類,因此切面不到,也根本沒有對應的 class 文件。

3、如何正確使用 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盤建立出一個文件夾 C:\aspectj1.9,包括:bin、doc、lib等,後面咱們就會使用到這些內容。

2. AspectJ 插件

在專業版 IDEA 中開發 AspectJ,須要安裝如下兩個插件:

  • Spring AOP/@AspectJ
  • AspectJ Support

3. 添加依賴 aspectjrt.jar

開始以前須要在項目中添加 aspectjrt.jar 依賴,aspectjrt.jar 即 AspectJ 安裝目錄中lib目錄下的jar包。你能夠複製到工程中引入,也能夠直接引入

  1. 在工程上鼠標右鍵,點擊 Open Module Setting 打開 Project Structure
  2. 點擊 Libraries 選項卡,和上面的 + 號,建立 New Project Library
  3. 選擇 C:\aspectj1.9\lib\aspectjrt.jar 路徑,點擊便可配置完成

4. 配置AspectJ編譯器

IDEA 默認使用 javac 編譯器,這裏須要配置 AspectJ 的編譯器 ajc,在 IDEA 中作相應配置。

  1. 打開 IDEA -> File -> Settings 對話
  2. 選擇 Build,Execution,Deployment -> Compiler -> Java Compiler
  3. Use complier:選擇 Ajc
  4. 在 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 的使用也能夠嘗試搞搞,此篇還只是關於此類切面寫法的一個入門。

4、總結

  • 你的代碼越粗獷、越豪放、越騷氣,幾乎你遇到的問題也是越多的,可能就是由於沒有遵照必定的研發執行規範,因此遇到的這些有點傻的問題,幾乎會浪費掉你一個上午或者一天。
  • 但有些時候若是你能認真對待你弄出來的bug,深刻分析下它是如何產生的,並把它復現出來一點點深刻研究下,可能也會獲得意想不到的收穫,也說不定。因此凡是認真,凡事沒有壞事。
  • 關於切面、關於源碼、關於開發,可能並不該該只注重於功能實現,甚至有時候要想辦法逃離日復一日沒有成長的工做內容。多在那些有價值的技術上下功夫,那你的收穫也是最多的。

5、系列推薦

相關文章
相關標籤/搜索