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

Java AOP 核心概念與 JBoss AOP 實戰:攔截器、元資料、引入與切入點全解析

     編輯:Java 相關知識

前言:AOP 與 OOP 的正交關係

面向切面程式設計(AOP)非取代 OOP,而是補足 OOP 在「橫切關注點」上的不足:日誌、安全、交易、效能監控等邏輯分散在無數業務類別中,導致程式碼糾纏、難以維護。AOP 將這些橫切邏輯模組化為切面,透過切入點精準織入目標連接點,實現關注點分離。

四大核心構件

Advice / Interceptor(通知/攔截器)
定義「在何時做什麼事」的程式碼塊(前置、後置、環繞、拋出異常等)。
Introduction(引入)
動態為現有類別新增方法、欄位或實作新介面(類似 Mixin)。
Metadata(元資料)
附加於類別/方法/欄位的標註資訊(如交易屬性、安全角色),供攔截器讀取決策。
Pointcut(切入點)
定義「在哪裡套用上述特性」的匹配規則(正則、註解、控制流等)。

JBoss AOP 實戰三部曲

環境:JBoss 4.0 內建 AOP 框架,獨立運行需 jboss-aop.jar、javassist.jar、自訂 ClassLoader

例 1:攔截器實作方法追蹤

public class TracingInterceptor implements Interceptor {
    public String getName() { return "TracingInterceptor"; }
    public InvocationResponse invoke(Invocation inv) throws Throwable {
        String msg = "";
        if (inv.getType() == InvocationType.METHOD) {
            msg = "method: " + MethodInvocation.getMethod(inv).getName();
        } else if (inv.getType() == InvocationType.CONSTRUCTOR) {
            msg = "constructor: " + ConstructorInvocation.getConstructor(inv);
        } else { return inv.invokeNext(); } // 忽略欄位存取
        System.out.println("Entering " + msg);
        InvocationResponse rsp = inv.invokeNext(); // 執行真實目標
        System.out.println("Leaving " + msg);
        return rsp;
    }
}

切入點 XML (jboss-aop.xml)

<aop>
  <interceptor-pointcut class="POJO">
    <interceptors><interceptor class="TracingInterceptor"/></interceptors>
  </interceptor-pointcut>
</aop>

class=".*" 可攔截所有類別;com.mypkg.* 限定套件。

例 2:元資料過濾不追蹤 getter/setter/main

XML 定義元資料

<class-metadata group="tracing" class="POJO">
  <method name="(get.*)|(set.*)"><filter>true</filter></method>
  <method name="main"><filter>true</filter></method>
</class-metadata>

攔截器讀取元資料決定是否跳過

String filter = (String) inv.getMetaData("tracing", "filter");
if ("true".equals(filter)) return inv.invokeNext();

例 3:引入實現動態開關追蹤

定義介面與 Mixin 實作

public interface Tracing { void enableTracing(); void disableTracing(); }

public class TracingMixin implements Tracing {
    private Advised advised;
    public TracingMixin(Object obj) { this.advised = (Advised) obj; }
    public void enableTracing() {
        advised._getInstanceAdvisor().getMetaData().addMetaData("tracing", "filter", false);
    }
    public void disableTracing() {
        advised._getInstanceAdvisor().getMetaData().addMetaData("tracing", "filter", true);
    }
}

引入切入點 XML

<introduction-pointcut class="POJO">
  <mixin>
    <interfaces>Tracing</interfaces>
    <class>TracingMixin</class>
    <construction>new TracingMixin(this)</construction>
  </mixin>
</introduction-pointcut>

客戶端動態切換

POJO pojo = new POJO();
Tracing t = (Tracing) pojo; // 強轉成功,因引入已實作介面
pojo.helloWorld();
t.disableTracing(); pojo.helloWorld(); // 不印追蹤
t.enableTracing();  pojo.helloWorld(); // 印追蹤

執行指令

export CLASSPATH=.:jboss-common.jar:jboss-aop.jar:javassist.jar
javac *.java
java -Djava.system.class.loader=org.jboss.aop.standalone.SystemClassLoader POJO

結語

JBoss AOP 展示了純 Java 實現 AOP 的完整能力:攔截器處理橫切邏輯、元資料提供聲明式配置、引入實現動態型別擴展、切入點精準編織。現代 Spring AOP、AspectJ 雖語法更優雅,但核心概念一脈相承。掌握本文四大構件,即可駕馭主流 AOP 框架。

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