首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

AspectWerkz 實戰:基於 Java 的輕量級 AOP 框架 (離線/線上雙模式織入)

     編輯:Java 程式設計入門

前言:為什麼選 AspectWerkz?

在 AspectJ 以「擴展 Java 語法、專用編譯器 (ajc)、載入期織入 (LTW) 需特殊啟動腳本」確立標準地位時,AspectWerkz (AW) 由 Jonas Bonér 與 Alexandre Vasseur 創建,走了一條**純 Java、無語法擴展、部署極簡**的差異化道路。雖後來 AspectWerkz 併入 AspectJ 5 (成為其代理風格織入引擎),但其設計理念 — **「不修改建構流程、不侵入源碼、運行時動態織入」** — 仍具備極高參考價值,尤其適合:**無法控制啟動腳本的受管環境 (共享主機、舊版應用伺服器)、需零依賴引入 AOP 的棕地專案、動態代理無法滿足 (如攔截私有方法、建構子、final 方法) 的場景。**

一、AOP 核心術語速查

術語定義例子
Joinpoint程式執行中可定義切入點的位置方法呼叫、方法執行、例外拋出、欄位讀寫、建構子執行
Pointcut選擇一組 Joinpoint 的謂語表達式execution(* com.service.*.*(..))、@annotation(Transactional)
Advice在 Pointcut 位置執行的程式碼邏輯Before/After/AfterReturning/AfterThrowing/Around
AspectPointcut + Advice 的模組化封裝LoggingAspect, TransactionAspect, SecurityAspect
Weaving將 Advice 植入目標類別的過程編譯期 (CTW)、類載入期 (LTW)、運行期 (代理/字節碼重寫)
Introduction為現有類別動態新增介面/方法/欄位讓任意 POJO 實作 Monitorable 介面

二、AspectWerkz 兩種織入模式深度解析

1. 線上模式 — 類載入期攔截 (LTW),零建構修改

  • 原理:實作 java.lang.instrument.ClassFileTransformer,註冊為 JVM Agent。JVM 載入類別前回調 transform(),AW 解析類別字節碼,根據定義織入 Advice,返回修改後字節碼。
  • 啟動方式:java -javaagent:aspectwerkz.jar -cp ... MainClass (JDK 5+ 標準 Agent 协议)。AW 提供 aspectwerkz 封裝腳本自動適配 JVM 版本。
  • 優勢:應用代碼零修改、零重新編譯、支援任意類載入器 (Web 應用各模組隔離類載入器)、可攔截私有/建構子/final 方法。
  • 劣勢:需控制 JVM 啟動參數 (加 -javaagent);類載入期增加延遲;生產環境需嚴格測試織入正確性。

2. 離線模式 — 建構期字節碼後處理 (CTW),通用部署

  • 流程:
    1. 標準 javac 編譯產生 .class。
    2. 執行 awc (AspectWerkz Compiler) 讀取編譯輸出目錄 + aop.xml 定義,輸出織入後 .class。
  • 優勢:無需修改啟動腳本、織入後類別可在任意 JDK 1.3+ JVM 運行、易整合 Ant/Maven 建構流程。
  • 劣勢:需額外建構步驟;增量編譯需重新織入;動態類 (JSP 編譯、動態代理) 無法織入。

三、實戰:離線模式整合 Maven 專案 (以日誌切面為例)

1. 依賴配置 (pom.xml)



    
        org.aspectwerkz
        aspectwerkz
        2.2.3 
    



    
        
            org.codehaus.mojo
            aspectwerkz-maven-plugin
            2.2.3
            
                
                    compile 
                
            
            
                
                    com.example.aspect.LoggingAspect
                
                src/main/resources/aop.xml
            
        
    

2. 切面定義 (aop.xml)




    
        
        
            
            
        
    

3. 切面實作類


package com.example.aspect;

import org.aspectwerkz.joinpoint.ProceedingJoinPoint;

public class LoggingAspect {
    public Object logAround(ProceedingJoinPoint pjp) throws Throwable {
        String method = pjp.getSignature().getName();
        long start = System.nanoTime();
        try {
            System.out.println("[AW] Entering: " + method);
            return pjp.proceed(); // 執行目標方法
        } finally {
            long elapsed = System.nanoTime() - start;
            System.out.println("[AW] Exiting: " + method + " took " + elapsed/1_000_000 + " ms");
        }
    }
}

4. 目標服務類 (無任何 AOP 痕跡)


package com.example.service;

public class OrderService {
    public void placeOrder(String itemId) {
        System.out.println("Placing order for: " + itemId);
        // 業務邏輯...
    }
}

四、進階特性:Introduction (動態介面實作)

AW 支援為現有類別動態混入介面實作:




     // 建構子切點
    


// 介面
public interface Monitorable {
    long getCreationTime();
    void setCreationTime(long t);
}

// Mixin 實作 (需無參構造函式)
public class MonitoringMixin implements Monitorable {
    private long creationTime;
    public long getCreationTime() { return creationTime; }
    public void setCreationTime(long t) { creationTime = t; }
}

// 使用
OrderService svc = new OrderService();
Monitorable m = (Monitorable) svc; // 強制轉型成功!
m.setCreationTime(System.currentTimeMillis());

**威力**:無修改原始碼,賦予任意物件新能力 (監控、序列化、快取、安全標記)。

五、遷移指南:AspectWerkz → AspectJ 5+

AspectWerkz 核心織入引擎已併入 AspectJ 5 (2005)。現代專案請直接使用 **AspectJ @AspectJ 風格 + Spring AOP / LTW**:

  • Maven: aspectj-maven-plugin (CTW) 或 -javaagent:aspectjweaver.jar (LTW)。
  • 註解: @Aspect, @Pointcut, @Around, @DeclareParents (對應 Introduction)。
  • Spring: @EnableAspectJAutoProxy (代理模式) / @EnableLoadTimeWeaving (LTW)。

結語

AspectWerkz 以**「輕量、無侵入、雙模式織入、Introduction 黑科技」**證明了 AOP 不必綁定語言擴展。雖專案已併入 AspectJ,但其設計啟示 — **字節碼級別的靈活織入、建構與部署分離、動態能力賦予** — 依然活躍於現代框架 (Spring, Quarkus, Micronaut, ByteBuddy, Arthas) 中。理解 AW,是理解 Java 動態化能力的關鍵一課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved