?? 第二部分:ejb 編程模型(轉(zhuǎn)).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]內(nèi)容:[/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]服務(wù)器和容器[/url][/TD][/TR][TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/index.shtml#3]Bean 風(fēng)格[/url][/TD][/TR][TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/index.shtml#4]第三部分內(nèi)容預(yù)告[/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]相關(guān)內(nèi)容:[/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]第一部分:體系結(jié)構(gòu)的歷史和目標(biāo)[/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]本文的第二部分說明創(chuàng)建 Enterprise JavaBean 組件所需的 Java 接口和類的作用。除了對 bean 類本身進行編碼外,EJB 開發(fā)人員還必須為 bean 定義一個本地接口和一個遠(yuǎn)程接口。這些接口的實現(xiàn)類通常由容器生成,因此部署 EJB 組件是開發(fā)人員和 EJB 容器的合作行為。第二部分還區(qū)分了 enterprise bean 的兩種主要類型,即會話 bean 和實體 bean,并說明了 EJB 容器和 EJB 服務(wù)器之間的關(guān)系。[/BLOCKQUOTE]
enterprise bean 的編程模型的三個關(guān)鍵特征是:面向?qū)ο蟆ο蟮姆植际胶褪褂么韺ο蟆S捎诖司幊棠P褪褂?Java 技術(shù),因此它在本質(zhì)上就是面向?qū)ο蟮摹4四P鸵彩欠植际降模@是指 bean 在理論上是位置透明的。根據(jù) Enterprise JavaBeans (EJB) 規(guī)范,“一般說來,EJB 類和 EJB 容器的實際位置對客戶機是透明的。”在客戶機想要訪問 EJB 組件時使用代理對象。bean 本身對于客戶機是不可訪問的,對 bean 方法的訪問則由 helper 類提供。
[b]接口、委托和代理[/b]
當(dāng) Java 程序員編寫一個 Enterprise JavaBeans 組件時,他們所創(chuàng)建的類必須實現(xiàn)一個 EJB 接口,并且它必須包含一個名為 ejbCreate() 的方法。一個 EJB 接口 -- 例如 SessionBean 接口 -- 指定了一些方法,它們包括以下各項: [UL][LI]ejbActivate() [LI]ejbPassivate() [LI]ejbRemove() [LI]setSessionContext()[/LI][/UL]
ejbActivate() 和 ejbPassivate() 方法通知一個 bean,管理該 bean 的容器組件正在主動和被動之間切換 bean 的狀態(tài)(這通常是指在內(nèi)存中還是交換到磁盤)。ejbRemove() 方法使 bean 知道它已被從容器中刪除。setSessionContext() 方法使 bean 與一個上下文對象相關(guān)聯(lián),此上下文對象是為了便于 bean 與其容器進行通信。
ejbCreate() 方法并不是從零做起創(chuàng)建 enterprise bean 的。當(dāng)客戶機想要創(chuàng)建新的 enterprise bean 時,bean 的容器將調(diào)用這個 bean 的類的 newInstance() 方法,來實例化新的 bean 對象。然后容器調(diào)用 setSessionContext() 方法來建立上下文對象,用于與 bean 進行通信。最后,容器調(diào)用新 bean 中的 ejbCreate() 方法。像 ejbCreate()、ejbActivate() 和 ejbPassivate() 這樣的方法有時稱為[I]對象生存周期[/I]方法,以區(qū)別于[I]業(yè)務(wù)邏輯[/I]方法。
當(dāng)開發(fā)人員設(shè)計一個新的 EJB 組件時,編寫組成 enterprise bean 類的代碼本身是不夠的。EJB 程序員還必須編寫兩個將由 helper 類使用的 Java 接口。這些強制性接口必須擴展標(biāo)準(zhǔn)的 EJBObject 和 EJBHome 接口,而這兩個接口則都是 java.rmi.Remote marker 接口的擴展。擴展標(biāo)準(zhǔn) EJBObject 接口的接口被稱為 enterprise bean 的[I]遠(yuǎn)程接口[/I],它指定在 bean 自身中定義的業(yè)務(wù)方法。當(dāng)應(yīng)用程序調(diào)用 enterprise bean 中的業(yè)務(wù)方法時,應(yīng)用程序并不訪問 bean 本身。實際上,方法調(diào)用被傳遞給實現(xiàn) EJBObject 接口擴展的那個對象。這種做法稱為[I]委托[/I],它是 EJB 體系結(jié)構(gòu)中的一個設(shè)計要點:
[BLOCKQUOTE]“客戶機從來不直接訪問 enterprise bean 類的實例。客戶機總是使用 enterprise bean 的遠(yuǎn)程接口來訪問 enterprise bean 的實例。實現(xiàn) enterprise bean 的遠(yuǎn)程接口的類由容器提供。此類所實現(xiàn)的分布式對象稱為 [I]EJB 對象[/I]。”([I]Enterprise JavaBeans Specification 1.0)[/I][/BLOCKQUOTE]
bean 對 EJBObject 接口的擴展稱為其[I]遠(yuǎn)程接口[/I],而實現(xiàn)遠(yuǎn)程接口的對象則稱為 [I]EJB 對象[/I]。
enterprise bean 還必須具有本地接口。此接口是標(biāo)準(zhǔn) EJBHome 接口的擴展。實現(xiàn) bean 的本地接口的對象稱為[I]本地對象[/I]。本地對象包含一個 create() 方法,此方法由應(yīng)用程序調(diào)用,而應(yīng)用程序則必須創(chuàng)建一個 bean 實例。本地對象中的 create() 方法創(chuàng)建一個新的 EJB 對象。它并不直接創(chuàng)建新的 enterprise bean 實例,因為不允許直接訪問 bean。
EJB 對象和本地對象充當(dāng) bean 對象的代理,因為它們代表 bean 接收方法調(diào)用。EJB 對象主要為 bean 業(yè)務(wù)方法充當(dāng)代理;本地對象主要為 bean 生存周期方法充當(dāng)代理。
為 EJB 組件使用 create() 方法并不一定要實例化新的 bean。容器確定如何最好地滿足創(chuàng)建請求,對于某些類型的 bean,它可以重用現(xiàn)有的實例:
[BLOCKQUOTE]“客戶機使用會話 bean 本地接口上的 [I]create[/I] 和 [I]remove[/I] 方法。雖然客戶機以為它正在控制著 EJB 實例的生存周期,但是,是容器在處理 [I]create[/I] 和 [I]remove[/I] 調(diào)用,而不一定要創(chuàng)建和刪除 EJB 實例。在客戶機和...實例之間不存在固定的映射。容器只是將客戶機的工作委托給任何一個方法已經(jīng)就緒的可用實例而已。”([I]Enterprise JavaBeans Specification 1.0)[/I][/BLOCKQUOTE]
創(chuàng)建新的 bean 實例受容器的控制,并可以與客戶機發(fā)布 create() 方法異步。
當(dāng)創(chuàng)建一個 EJB 組件時,開發(fā)人員負(fù)責(zé)定義 EJBObject 接口和 EJBHome 接口,但是無需編寫實現(xiàn)這些接口的類的代碼。EJB 容器軟件組件自動創(chuàng)建這些類。
下面的代碼段說明客戶機應(yīng)用程序可能怎樣使用稱為 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 是實現(xiàn)本地接口的類(EJBHome 接口的擴展)。Cart 是實現(xiàn)遠(yuǎn)程接口的類(EJBObject 接口的擴展)。當(dāng)客戶機調(diào)用應(yīng)用程序方法(如 addItem() 和 purchase())時,它們是在 cart 對象上調(diào)用的,此對象接著將這些方法的執(zhí)行委托給 bean 自身。enterprise bean 的功能是通過其代理 EJB 對象(即 cart)來獲得的。如果多臺客戶機同時訪問 cart bean,將會發(fā)生什么事情呢?Enterprise bean 開發(fā)人員無需編寫代碼來支持并發(fā)訪問。并發(fā)性由 EJB 容器支持。
下圖說明各 EJB 對象之間的關(guān)系:
[img]http://www.cn.ibm.com/developerWorks/java/what-are-ejbs/part2/ejb1.gif[/img]
[b]服務(wù)器和容器[/b]
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -