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

EJB 3 開發指南(15):攔截器方法與攔截器類完整解析

     編輯:Java 相關知識

EJB 3 的攔截器機制類似 AOP 的 Around Advice,能在不修改業務邏輯的前提下,橫切處理日誌、安全、交易等關注點。本文深入解析「攔截器方法」與「攔截器類」兩種實作方式、執行順序控制與排除機制。

一、攔截器方法:類內部定義

在 Bean 類別內直接定義攔截方法,以 @AroundInvoke 註解標記,方法簽名固定為:

public Object <methodName>(InvocationContext ic) throws Exception

範例:雙攔截器方法

@Stateful
public class GreeterBean implements Greeter {

    @AroundInvoke
    public Object myInterceptorMethod1(InvocationContext ic) throws Exception {
        System.out.println("myInterceptorMethod1: " + ic.getMethod().getName());
        return ic.proceed(); // 必須呼叫 proceed() 繼續鏈路
    }

    @AroundInvoke
    public Object myInterceptorMethod2(InvocationContext ic) throws Exception {
        System.out.println("myInterceptorMethod2: " + ic.getMethod().getName());
        return ic.proceed();
    }

    @Override
    public String greet(String name) {
        return "hello " + name;
    }
}

關鍵規則

  1. 回傳型別必須為 Object
  2. 唯一參數必須為 javax.interceptor.InvocationContext
  3. 必須呼叫 ic.proceed() 才會執行下一個攔截器或目標方法
  4. 拋出 Exception:因 proceed() 拋出 Exception,攔截器方法須同樣拋出或 try-catch 處理

執行順序

客戶端呼叫 greet() 時,容器依宣告順序依序執行:
myInterceptorMethod1 → myInterceptorMethod2 → greet()

二、攔截器類:跨 Bean 重用

將攔截邏輯抽離至獨立類別,供多個 Bean 共用。

1. 定義攔截器類

package service;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class MyInterceptor {
    @AroundInvoke
    public Object interceptorMethod(InvocationContext ic) throws Exception {
        System.out.println("MyInterceptor: " + ic.getMethod().getName());
        return ic.proceed();
    }
}

2. 在 Bean 上套用

@Stateful
@Interceptors(MyInterceptor.class)
public class GreeterBean implements Greeter {
    // 類內部攔截器方法...
    @Override
    public String greet(String name) { return "hello " + name; }
}

3. 多攔截器類指定順序

@Interceptors({MyInterceptor.class, MyInterceptor1.class})

容器按陣列順序執行:MyInterceptor → MyInterceptor1 → Bean 內部攔截器方法

三、排除機制:@ExcludeClassInterceptors

若某方法不想被類別級攔截器攔截(但仍受 Bean 內部攔截器影響),加上註解:

@ExcludeClassInterceptors
public String getValue() {
    return "abcd";
}

執行流程總結圖

客戶端呼叫 greet()
    │
    ▼
MyInterceptor.interceptorMethod()  ← @Interceptors 類別級
    │
    ▼
MyInterceptor1.interceptorMethod() ← 多類別級依順序
    │
    ▼
myInterceptorMethod1()             ← Bean 內部攔截器 1
    │
    ▼
myInterceptorMethod2()             ← Bean 內部攔截器 2
    │
    ▼
greet()                            ← 目標業務方法

最佳實踐建議

  • 通用邏輯(日誌、效能監控、權限檢查) → 獨立攔截器類 + @Interceptors
  • 特定 Bean 專用邏輯 → 類內部 @AroundInvoke 方法
  • 例外處理:攔截器中捕獲 proceed() 拋出的異常,可統一轉換為業務異常或記錄錯誤日誌
  • 效能考量:避免在攔截器執行耗時操作,影響整體回應時間
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved