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

軟體架構模式在 J2EE 中的實戰應用:管道過濾器模式深度解析

     編輯:Java 相關知識

軟體架構模式是系統級重用的核心資產。本文深度剖析「管道過濾器」架構模式的理論基礎、結構特性、優缺點,並以 Servlet 2.3 Filter、JBoss EJB 容器攔截器鏈、Axis Handler 鏈 三大 J2EE 經典實作為例,展示該模式在企業級中介軟體中的核心地位。

管道過濾器架構模式理論基礎

核心結構

  • Filter (過濾器):獨立處理單元,封裝單一處理步驟,輸入→轉換→輸出
  • Pipe (管道):連接相鄰 Filter 的資料通道,傳輸資料流
  • 資料流:單向流動,上游輸出 = 下游輸入

關鍵特性

  1. 獨立性:Filter 無共享狀態,僅透過資料流互動
  2. 無知性:Filter 不知上下游具體實作,僅依賴資料格式契約
  3. 可組合性:Filter 可替換、重排序、獨立開發測試
  4. 串流處理:支援增量處理,無需載入完整資料

非軟體類比:自來水處理廠

原水 → 沉澱池 → 過濾池 → 消毒池 → 加壓泵 → 管網 → 用戶端

每個處理單元獨立運作,透過管道連接,可獨立維護升級。

優缺點權衡

優點缺點
替換/重組 Filter 極靈活共享狀態昂貴或不靈活 (需額外上下文物件)
Filter 組件高度可重用資料格式轉換額外開銷 (序列化/解析)
快速原型 (管道組裝)錯誤處理複雜 (哪個 Filter 失敗?如何回滾?)
並行處理潛力 (Pipe 並行)除錯困難 (資料流中間狀態不可見)

J2EE 經典實作一:Servlet 2.3 Filter

標準介面契約


public interface Filter {
    void init(FilterConfig config) throws ServletException;
    void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
        throws IOException, ServletException;
    void destroy();
}

FilterChain 驅動機制


// Filter 內部呼叫下一級
chain.doFilter(request, response); // 推模式:主動推送給下游

PetStore 1.3.1 雙 Filter 實戰


// 1. 編碼轉換 Filter
public class EncodingFilter implements Filter {
    private String encoding = "UTF-8";
    
    public void init(FilterConfig config) {
        encoding = config.getInitParameter("encoding");
    }
    
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
        ((HttpServletRequest)req).setCharacterEncoding(encoding);
        chain.doFilter(req, res); // 傳遞給下一級 (安全 Filter)
    }
}

// 2. 安全驗證 Filter
public class SignOnFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
        // 安全檢查邏輯...
        if (authorized) chain.doFilter(req, res); // 通過則繼續
        else redirectToLogin(); // 失敗則短路,不呼叫 chain.doFilter
    }
}

web.xml 部署配置 (決定執行順序)


<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.app.EncodingFilter</filter-class>
    <init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter>
    <filter-name>SignOnFilter</filter-name>
    <filter-class>com.app.SignOnFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>SignOnFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

順序即正義:`web.xml` 宣告順序 = Filter 執行順序。

進階:Response 包裝器模式 (Decorator 應用)


public class UCaseResponse extends HttpServletResponseWrapper {
    public UCaseResponse(HttpServletResponse res) { super(res); }
    public PrintWriter getWriter() {
        return new UCaseWriter(super.getWriter()); // 包裝 Writer
    }
}

public class UCaseWriter extends PrintWriter {
    public void write(int c) { super.write(Character.toUpperCase((char)c)); }
    // 重寫所有 write 方法...
}

// Filter 中使用
chain.doFilter(request, new UCaseResponse((HttpServletResponse)response));

J2EE 經典實作二:JBoss EJB 容器攔截器鏈

架構對應

  • Client 呼叫 → 容器代理 → 攔截器鏈 → EJB Bean 實例
  • 每個攔截器 = 一個 Filter
  • 攔截器鏈配置 = `standardjboss.xml` 中 ``

EntityBean 容器攔截器鏈結構


LogInterceptor → SecurityInterceptor → TxInterceptorCMT → MetricsInterceptor 
→ EntityLockInterceptor → EntityInstanceInterceptor → CachedConnectionInterceptor
→ EntitySynchronizationInterceptor → JDBCRelationInterceptor → Bean 實例

LogInterceptor 實作範例


public class LogInterceptor extends AbstractInterceptor {
    public Object invoke(Invocation invocation) throws Exception {
        if (log.isTraceEnabled()) { /* 記錄呼叫詳情 */ }
        return getNext().invoke(invocation); // 關鍵:傳遞給下一級攔截器
    }
}

配置檔驅動架構


<container-interceptors>
    <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
    <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
    <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
    <interceptor metricsEnabled="true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
    <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
    <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
    <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
    <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
    <interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor>
</container-interceptors>

架構優勢

  1. 單一職責:每個攔截器專注單一橫切關注點
  2. 開放封閉:新增功能 = 新增攔截器 + 配置,零修改核心容器代碼
  3. 錯誤隔離:攔截器拋出異常即短路鏈,統一異常處理
  4. 效能監控:MetricsInterceptor 透明收集效能指標

J2EE 經典實作三:Axis Handler 鏈 (Web Services)

架構對應

  • 訊息流:Transport Listener → Handler 鏈 → 服務實作
  • Handler = Filter,處理 `MessageContext` (含 Request/Response Message + Properties)
  • 部署描述檔 (`server-config.wsdd`) 定義 Handler 鏈順序

處理流程

  1. Transport Listener (HTTP/TCP/SMTP) 接收請求
  2. 解析協定生成 `Message` 物件
  3. 建立 `MessageContext` 設定 Request Message
  4. 依序呼叫 Handler 處理 (安全、日誌、SOAP Header 解析、Schema 驗證...)
  5. 最後 Handler 呼叫實際服務實作
  6. 回應訊息逆向經過 Handler 鏈

相關 GoF 設計模式映射

架構模式角色對應 GoF 模式應用場景
Filter 鏈驅動Chain of Responsibility請求沿鏈傳遞,任一節點可處理或短路
Filter 處理單元Command封裝請求為物件,支援排隊、日誌、撤銷
Request/Response 包裝Decorator動態增強功能 (編碼轉換、壓縮、加密、大寫轉換)

架構模式實作檢核清單

  1. 將系統任務分解為獨立處理階段
  2. 定義統一資料格式 (ServletRequest/Response、MessageContext、Invocation)
  3. 決定管道連接機制 (推模式 `chain.doFilter()`、拉模式、事件驅動)
  4. 設計 Filter 介面契約 (單一職責、無狀態、可序列化)
  5. 建立部署/配置機制定義鏈順序 (web.xml、XML 描述檔、Annotation、SPI)
  6. 實作錯誤處理策略 (短路、補償、重試、熔斷)
  7. 提供監控觀測點 (執行時間、通過率、錯誤率)

總結

管道過濾器模式以「獨立 Filter + 統一資料流 + 可配置鏈」三大支柱,成為 J2EE 中介軟體基礎設施的核心架構範式。從 Servlet Filter 的請求預處理,到 JBoss 攔截器實現企業級服務品質 (交易、安全、鎖定),再到 Axis Handler 處理 SOAP 訊息流,無不體現此模式的強大生命力。現代架構中,Spring ``、Dubbo ``、Netty ``、Service Mesh Sidecar 皆為此模式的演進與應用。掌握此模式,即掌握中介軟體擴充點設計的通用鑰匙。

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