?? 第二部分:ejb 編程模型(轉).txt
字號:
作者:zergman
email: zergman@chinaasp.com
日期:2001-6-15 13:38:17
[TABLE][TR][TD]什么是 Enterprise JavaBeans 組件?[/TD][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/index_eng.shtml][img]http://www.cn.ibm.com/developerworks/i/src.gif[/img][/url][/TD][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][/TABLE][TABLE][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][TD][TABLE][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][TD][TABLE][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][TR][TD][B]內容:[/B][/TD][/TR][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][TR][TD][TABLE][TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/index.shtml#1]接口、委托和代理[/url][/TD][/TR][TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/index.shtml#2]服務器和容器[/url][/TD][/TR][TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/index.shtml#3]Bean 風格[/url][/TD][/TR][TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/index.shtml#4]第三部分內容預告[/url][/TD][/TR][TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/index.shtml#resources]參考資料[/url][/TD][/TR][TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/index.shtml#author]作者簡介[/url][/TD][/TR][/TABLE][/TD][/TR][/TABLE][TABLE][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][TR][TD][B]相關內容:[/B][/TD][/TR][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][TR][TD][TABLE][TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part1/index.shtml]第一部分:體系結構的歷史和目標[/url][/TD][/TR][TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part3/index.shtml]第三部分:部署和使用 EJB 組件[/url][/TD][/TR][/TABLE][/TD][/TR][/TABLE][TABLE][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][/TABLE][/TD][/TR][/TABLE]第二部分:EJB 編程模型
Ken Nordby
IBM 軟件工程師
2000 6 月
[BLOCKQUOTE]本文的第二部分說明創建 Enterprise JavaBean 組件所需的 Java 接口和類的作用。除了對 bean 類本身進行編碼外,EJB 開發人員還必須為 bean 定義一個本地接口和一個遠程接口。這些接口的實現類通常由容器生成,因此部署 EJB 組件是開發人員和 EJB 容器的合作行為。第二部分還區分了 enterprise bean 的兩種主要類型,即會話 bean 和實體 bean,并說明了 EJB 容器和 EJB 服務器之間的關系。[/BLOCKQUOTE]
enterprise bean 的編程模型的三個關鍵特征是:面向對象、對象的分布式和使用代理對象。由于此編程模型使用 Java 技術,因此它在本質上就是面向對象的。此模型也是分布式的,這是指 bean 在理論上是位置透明的。根據 Enterprise JavaBeans (EJB) 規范,“一般說來,EJB 類和 EJB 容器的實際位置對客戶機是透明的?!痹诳蛻魴C想要訪問 EJB 組件時使用代理對象。bean 本身對于客戶機是不可訪問的,對 bean 方法的訪問則由 helper 類提供。
[b]接口、委托和代理[/b]
當 Java 程序員編寫一個 Enterprise JavaBeans 組件時,他們所創建的類必須實現一個 EJB 接口,并且它必須包含一個名為 ejbCreate() 的方法。一個 EJB 接口 -- 例如 SessionBean 接口 -- 指定了一些方法,它們包括以下各項: [UL][LI]ejbActivate() [LI]ejbPassivate() [LI]ejbRemove() [LI]setSessionContext()[/LI][/UL]
ejbActivate() 和 ejbPassivate() 方法通知一個 bean,管理該 bean 的容器組件正在主動和被動之間切換 bean 的狀態(這通常是指在內存中還是交換到磁盤)。ejbRemove() 方法使 bean 知道它已被從容器中刪除。setSessionContext() 方法使 bean 與一個上下文對象相關聯,此上下文對象是為了便于 bean 與其容器進行通信。
ejbCreate() 方法并不是從零做起創建 enterprise bean 的。當客戶機想要創建新的 enterprise bean 時,bean 的容器將調用這個 bean 的類的 newInstance() 方法,來實例化新的 bean 對象。然后容器調用 setSessionContext() 方法來建立上下文對象,用于與 bean 進行通信。最后,容器調用新 bean 中的 ejbCreate() 方法。像 ejbCreate()、ejbActivate() 和 ejbPassivate() 這樣的方法有時稱為[I]對象生存周期[/I]方法,以區別于[I]業務邏輯[/I]方法。
當開發人員設計一個新的 EJB 組件時,編寫組成 enterprise bean 類的代碼本身是不夠的。EJB 程序員還必須編寫兩個將由 helper 類使用的 Java 接口。這些強制性接口必須擴展標準的 EJBObject 和 EJBHome 接口,而這兩個接口則都是 java.rmi.Remote marker 接口的擴展。擴展標準 EJBObject 接口的接口被稱為 enterprise bean 的[I]遠程接口[/I],它指定在 bean 自身中定義的業務方法。當應用程序調用 enterprise bean 中的業務方法時,應用程序并不訪問 bean 本身。實際上,方法調用被傳遞給實現 EJBObject 接口擴展的那個對象。這種做法稱為[I]委托[/I],它是 EJB 體系結構中的一個設計要點:
[BLOCKQUOTE]“客戶機從來不直接訪問 enterprise bean 類的實例。客戶機總是使用 enterprise bean 的遠程接口來訪問 enterprise bean 的實例。實現 enterprise bean 的遠程接口的類由容器提供。此類所實現的分布式對象稱為 [I]EJB 對象[/I]。”([I]Enterprise JavaBeans Specification 1.0)[/I][/BLOCKQUOTE]
bean 對 EJBObject 接口的擴展稱為其[I]遠程接口[/I],而實現遠程接口的對象則稱為 [I]EJB 對象[/I]。
enterprise bean 還必須具有本地接口。此接口是標準 EJBHome 接口的擴展。實現 bean 的本地接口的對象稱為[I]本地對象[/I]。本地對象包含一個 create() 方法,此方法由應用程序調用,而應用程序則必須創建一個 bean 實例。本地對象中的 create() 方法創建一個新的 EJB 對象。它并不直接創建新的 enterprise bean 實例,因為不允許直接訪問 bean。
EJB 對象和本地對象充當 bean 對象的代理,因為它們代表 bean 接收方法調用。EJB 對象主要為 bean 業務方法充當代理;本地對象主要為 bean 生存周期方法充當代理。
為 EJB 組件使用 create() 方法并不一定要實例化新的 bean。容器確定如何最好地滿足創建請求,對于某些類型的 bean,它可以重用現有的實例:
[BLOCKQUOTE]“客戶機使用會話 bean 本地接口上的 [I]create[/I] 和 [I]remove[/I] 方法。雖然客戶機以為它正在控制著 EJB 實例的生存周期,但是,是容器在處理 [I]create[/I] 和 [I]remove[/I] 調用,而不一定要創建和刪除 EJB 實例。在客戶機和...實例之間不存在固定的映射。容器只是將客戶機的工作委托給任何一個方法已經就緒的可用實例而已。”([I]Enterprise JavaBeans Specification 1.0)[/I][/BLOCKQUOTE]
創建新的 bean 實例受容器的控制,并可以與客戶機發布 create() 方法異步。
當創建一個 EJB 組件時,開發人員負責定義 EJBObject 接口和 EJBHome 接口,但是無需編寫實現這些接口的類的代碼。EJB 容器軟件組件自動創建這些類。
下面的代碼段說明客戶機應用程序可能怎樣使用稱為 CartBean 的 enterprise bean 來進行在線購物: [TABLE][TR][TD][PRE]CartHome cartHome = javax.rmi.PortableRemoteObject.narrow(initialContext.lookup("applications/shopping_cart"), CartHome.class);
Cart cart = cartHome.create();
cart.addItem(item29);
cart.addItem(item67);
cart.addItem(item91);
cart.purchase();
cart.remove();
[/PRE][/TD][/TR][/TABLE]
CartHome 是實現本地接口的類(EJBHome 接口的擴展)。Cart 是實現遠程接口的類(EJBObject 接口的擴展)。當客戶機調用應用程序方法(如 addItem() 和 purchase())時,它們是在 cart 對象上調用的,此對象接著將這些方法的執行委托給 bean 自身。enterprise bean 的功能是通過其代理 EJB 對象(即 cart)來獲得的。如果多臺客戶機同時訪問 cart bean,將會發生什么事情呢?Enterprise bean 開發人員無需編寫代碼來支持并發訪問。并發性由 EJB 容器支持。
下圖說明各 EJB 對象之間的關系:
[img]http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/ejb1.gif[/img]
[b]服務器和容器[/b]
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -