Enterprise JavaBeans (EJB) 作為 J2EE 平台的核心組件,其遠程調用機制建立在 RMI (Remote Method Invocation) 之上,但比標準 RMI 更為複雜。一個典型的遠程物件至少需要 4 個類別檔案:遠程物件本身、遠程介面、Stub (客戶端代理) 和 Skeleton (伺服器端代理)。然而在 EJB 架構中,這一數字增長到至少 10 個類別,反映了 EJB 容器為管理生命週期、事務、安全等企業級服務所引入的額外層次。
這 10 個類別分為兩大類:
開發人員實際只需編寫 3 個類別:Bean 類別、Remote 介面和 Home 介面。其餘 7 個類別由 EJB 容器工具 (如 WebLogic 的 ejbc) 自動生成,具體生成方式和打包位置因應用伺服器而異。
以 WebLogic 為例:
一次客戶端對 EJB 的遠程調用,實際經歷了 兩次完整的 RMI 循環:
ctx.lookup("Hello"))HelloBean_HomeImpl_WLStub 實例HelloHome 介面引用,實際指向 HelloBean_HomeImpl_WLStub@18c458home.create(),實際觸發 Stub 的 create() 方法HelloBean_HomeImpl_WLSkeletonHelloBean_HomeImpl.create()HelloBean_Impl.ejbCreate() 創建/分配 Bean 實例HelloBean_EOImpl_WLStub 實例,序列化返回客戶端Hello 介面引用,實際指向 HelloBean_EOImpl_WLStub@8fa0d1後續對 Remote 介面方法的調用 (如 h.helloWorld()) 將觸發第三次 RMI 循環:
HelloBean_EOImpl_WLStub.helloWorld()HelloBean_EOImpl_WLSkeletonHelloBean_EOImpl.helloWorld()HelloBean_Impl.helloWorld()HelloBean.helloWorld() 業務邏輯EJB 容器引入的多層代理模式 (Home/Remote 各有 Stub/Skeleton) 實現了:
HelloHome.class, Hello.class),Stub 由伺服器動態下發,解決了傳統 RMI 的類別分發難題這種設計雖增加了調用開銷,但為分散式企業應用提供了強大的中間件支撐。