一個 Bug,讓我發現了 Java 界的- AJ-錐-!

作者:小傅哥
博客:https://bugstack.cn

沉澱、分享、成長,讓自己和他人都能有所收穫!😜

目錄

一、前言

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

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

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

接下來我帶着大家一起看看什麼是快樂星球,他是怎麼一頓騷操作讓切面攔截不到的!

二、滿腦子都是騷操作

1. 遇到問題

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

2. 發現問題

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

3. 排查問題

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

三、如何正確使用 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

下載完成安裝;

2. AspectJ 插件

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

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

四、總結

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ArZX-gA1WTon864tjtvjag