一次遠程調用至少涉及 4 個 class 文件:
Stub 與遠程對象同時實現同一接口。客戶端代碼面向接口編程,實際操作 Stub 實例:
Hello h = new Hello_Stub(); // 實際類型為 Stub
h.getString(); // 委派給 Stub 發起網絡調用
客戶端需備有 Hello.class、Hello_Stub.class。
EJB 在 RMI 基礎上引入 Home/Remote 雙接口機制,至少包含 10 個 class:
| 類別 | 數量 | 說明 |
|---|---|---|
| Bean 類 | 1 | 用戶編寫 (HelloBean) |
| Bean 邏輯實現類 | 1 | App Server 生成 (HelloBean_Impl) |
| Remote 接口 | 1 | 用戶編寫 (Hello) |
| Remote 邏輯實現類 | 1 | App Server 生成 (HelloBean_EOImpl) |
| Remote Stub | 1 | App Server 生成 (HelloBean_EOImpl_WLStub) |
| Remote Skeleton | 1 | App Server 生成 (HelloBean_EOImpl_WLSkeleton) |
| Home 接口 | 1 | 用戶編寫 (HelloHome) |
| Home 邏輯實現類 | 1 | App Server 生成 (HelloBean_HomeImpl) |
| Home Stub | 1 | App Server 生成 (HelloBean_HomeImpl_WLStub) |
| Home Skeleton | 1 | App Server 生成 (HelloBean_HomeImpl_WLSkeleton) |
用戶僅編寫 3 個文件 (Bean、Remote、Home),其餘 7 個由容器工具生成。生成時機、打包方式因 App Server 而異。
_WLStub, _WLSkeleton),不產生物理 class 文件,直接在內存中定義類。ctx.lookup("Hello")HelloBean_HomeImpl_WLStub 類HelloHome 接口)home.create() (實際調用 Home Stub create())HomeImpl.create()HomeImpl.create() 內部調用 Bean_Impl.ejbCreate() 創建 Bean 實例EOImpl_WLStub) 序列化返回客戶端remote.method() (實際調用 Remote Stub)EOImpl.method()EOImpl.method() 委派給 Bean_Impl.method() (用戶業務代碼)ejbCreate、業務方法因為 Stub 類在部署時由容器動態生成並隨 Home/Remote Stub 實例一同序列化傳遞給客戶端。客戶端類加載器動態定義 Stub 類,實現零部署客戶端。