国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

什么是 Enterprise JavaBeans 組件?(二)

2019-11-18 14:47:13
字體:
供稿:網(wǎng)友

  出自:ibm KenNordby
第二部分:EJB 編程模型

本文的第二部分說明創(chuàng)建 EnterPRise javaBean 組件所需的 Java 接口和類的作用。除了對 bean 類本身進行編碼外,EJB 開發(fā)人員還必須為 bean 定義一個本地接口和一個遠程接口。這些接口的實現(xiàn)類通常由容器生成,因此部署 EJB 組件是開發(fā)人員和 EJB 容器的合作行為。第二部分還區(qū)分了 enterprise bean 的兩種主要類型,即會話 bean 和實體 bean,并說明了 EJB 容器和 EJB 服務器之間的關(guān)系。

enterprise bean 的編程模型的三個要害特征是:面向?qū)ο蟆ο蟮姆植际胶褪褂么韺ο蟆S捎诖司幊棠P褪褂?Java 技術(shù),因此它在本質(zhì)上就是面向?qū)ο蟮摹4四P鸵彩欠植际降模@是指 bean 在理論上是位置透明的。根據(jù) Enterprise JavaBeans (EJB) 規(guī)范,“一般說來,EJB 類和 EJB 容器的實際位置對客戶機是透明的。”在客戶機想要訪問 EJB 組件時使用代理對象。bean 本身對于客戶機是不可訪問的,對 bean 方法的訪問則由 helper 類提供。

接口、委托和代理
當 Java 程序員編寫一個 Enterprise JavaBeans 組件時,他們所創(chuàng)建的類必須實現(xiàn)一個 EJB 接口,并且它必須包含一個名為 ejbCreate() 的方法。一個 EJB 接口 -- 例如 sessionBean 接口 -- 指定了一些方法,它們包括以下各項:

ejbActivate()
ejbPassivate()
ejbRemove()
setSessionContext()

ejbActivate() 和 ejbPassivate() 方法通知一個 bean,治理該 bean 的容器組件正在主動和被動之間切換 bean 的狀態(tài)(這通常是指在內(nèi)存中還是交換到磁盤)。ejbRemove() 方法使 bean 知道它已被從容器中刪除。setSessionContext() 方法使 bean 與一個上下文對象相關(guān)聯(lián),此上下文對象是為了便于 bean 與其容器進行通信。

ejbCreate() 方法并不是從零做起創(chuàng)建 enterprise bean 的。當客戶機想要創(chuàng)建新的 enterprise bean 時,bean 的容器將調(diào)用這個 bean 的類的 newInstance() 方法,來實例化新的 bean 對象。然后容器調(diào)用 setSessionContext() 方法來建立上下文對象,用于與 bean 進行通信。最后,容器調(diào)用新 bean 中的 ejbCreate() 方法。像 ejbCreate()、ejbActivate() 和 ejbPassivate() 這樣的方法有時稱為對象生存周期方法,以區(qū)別于業(yè)務邏輯方法。

當開發(fā)人員設計一個新的 EJB 組件時,編寫組成 enterprise bean 類的代碼本身是不夠的。EJB 程序員還必須編寫兩個將由 helper 類使用的 Java 接口。這些強制性接口必須擴展標準的 EJBObject 和 EJBHome 接口,而這兩個接口則都是 java.rmi.Remote marker 接口的擴展。擴展標準 EJBObject 接口的接口被稱為 enterprise bean 的遠程接口,它指定在 bean 自身中定義的業(yè)務方法。當應用程序調(diào)用 enterprise bean 中的業(yè)務方法時,應用程序并不訪問 bean 本身。實際上,方法調(diào)用被傳遞給實現(xiàn) EJBObject 接口擴展的那個對象。這種做法稱為委托,它是 EJB 體系結(jié)構(gòu)中的一個設計要點:


“客戶機從來不直接訪問 enterprise bean 類的實例。客戶機總是使用 enterprise bean 的遠程接口來訪問 enterprise bean 的實例。實現(xiàn) enterprise bean 的遠程接口的類由容器提供。此類所實現(xiàn)的分布式對象稱為 EJB 對象。”(Enterprise JavaBeans Specification 1.0)

bean 對 EJBObject 接口的擴展稱為其遠程接口,而實現(xiàn)遠程接口的對象則稱為 EJB 對象。

enterprise bean 還必須具有本地接口。此接口是標準 EJBHome 接口的擴展。實現(xiàn) bean 的本地接口的對象稱為本地對象。本地對象包含一個 create() 方法,此方法由應用程序調(diào)用,而應用程序則必須創(chuàng)建一個 bean 實例。本地對象中的 create() 方法創(chuàng)建一個新的 EJB 對象。它并不直接創(chuàng)建新的 enterprise bean 實例,因為不答應直接訪問 bean。

EJB 對象和本地對象充當 bean 對象的代理,因為它們代表 bean 接收方法調(diào)用。EJB 對象主要為 bean 業(yè)務方法充當代理;本地對象主要為 bean 生存周期方法充當代理。

為 EJB 組件使用 create() 方法并不一定要實例化新的 bean。容器確定如何最好地滿足創(chuàng)建請求,對于某些類型的 bean,它可以重用現(xiàn)有的實例:


“客戶機使用會話 bean 本地接口上的 create 和 remove 方法。雖然客戶機以為它正在控制著 EJB 實例的生存周期,但是,是容器在處理 create 和 remove 調(diào)用,而不一定要創(chuàng)建和刪除 EJB 實例。在客戶機和...實例之間不存在固定的映射。容器只是將客戶機的工作委托給任何一個方法已經(jīng)就緒的可用實例而已。”(Enterprise JavaBeans Specification 1.0)

創(chuàng)建新的 bean 實例受容器的控制,并可以與客戶機發(fā)布 create() 方法異步。

當創(chuàng)建一個 EJB 組件時,開發(fā)人員負責定義 EJBObject 接口和 EJBHome 接口,但是無需編寫實現(xiàn)這些接口的類的代碼。EJB 容器軟件組件自動創(chuàng)建這些類。

下面的代碼段說明客戶機應用程序可能怎樣使用稱為 CartBean 的 enterprise bean 來進行在線購物:

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();


CartHome 是實現(xiàn)本地接口的類(EJBHome 接口的擴展)。Cart 是實現(xiàn)遠程接口的類(EJBObject 接口的擴展)。當客戶機調(diào)用應用程序方法(如 addItem() 和 purchase())時,它們是在 cart 對象上調(diào)用的,此對象接著將這些方法的執(zhí)行委托給 bean 自身。enterprise bean 的功能是通過其代理 EJB 對象(即 cart)來獲得的。假如多臺客戶機同時訪問 cart bean,將會發(fā)生什么事情呢?Enterprise bean 開發(fā)人員無需編寫代碼來支持并發(fā)訪問。并發(fā)性由 EJB 容器支持。

下圖說明各 EJB 對象之間的關(guān)系:

服務器和容器
EJB 體系結(jié)構(gòu)包括 EJB 服務器和 EJB 容器兩個概念。EJB 服務器充當一種組件執(zhí)行系統(tǒng),正如 EJB 白皮書中所述:

“Enterprise JavaBeans 規(guī)范為每個支持完全可移植性的 Java 應用程序服務器定義了一個標準模型。任何廠商都可以使用此模型來實現(xiàn)對 Enterprise JavaBeans 組件的支持。多種系統(tǒng)(如 TP 監(jiān)視器、CORBA 運行時系統(tǒng)、COM 運行時系統(tǒng)、數(shù)據(jù)庫系統(tǒng)、Web 服務器系統(tǒng)或其它基于服務器的運行時系統(tǒng))都可以調(diào)整到能夠支持可移植的 Enterprise JavaBeans 組件。”(Thomas, Enterprise JavaBeans Technology: Server Component Model for the Java Platform)

EJB 服務器為使用 EJB 組件的應用程序提供操作環(huán)境,并供給所有必需的服務,來支持 EJB 體系結(jié)構(gòu)。打包 EJB 服務器軟件并沒有預先規(guī)定的方式。一種方法是將它作為一項功能增強包括到應用程序服務器中,這就是在 IBM WebSphere Application Server, Advanced Edition, Version 2.0 中采用的方法。

EJB 組件并不在 EJB 服務器的頂部直接執(zhí)行。一個稱為 EJB 容器的中間軟件組件在 EJB 服務器環(huán)境中運行,從而又為這些 bean 自身提供操作環(huán)境。EJB 容器對 EJB 應用程序是完全透明的,但是在支持 bean 操作方面起著要害性的作用。

為了使 enterprise bean 能充當可重用的軟件組件,它們對特定的服務器或平臺功能不能有內(nèi)建的相關(guān)性。服務器端功能的幾種常見類型已經(jīng)被從 bean 設計中“分離出去”,而將此功能的責任轉(zhuǎn)移給了容器組件。例如,容器將被用來接管安全性、并發(fā)性、事務處理、交換到輔助存儲器和其它服務的責任,從而使 bean 免受服務器相關(guān)性的制約,并將按業(yè)務邏輯來優(yōu)化,而不是按服務邏輯來優(yōu)化。

EJB 白皮書這樣描述容器的作用:

“EJB 容器治理部署于其中的 enterprise bean。客戶機應用程序并不直接與 enterprise bean 進行交互。相反,客戶機應用程序通過由容器生成的兩個封裝接口( EJB Home 接口和 EJB Object 接口)與 enterprise bean 進行交互。當客戶機使用封裝接口調(diào)用各種操作時,容器截獲每個方法調(diào)用,并插入治理服務。”(Thomas, Enterprise JavaBeans Technology: Server Component Model for the Java Platform)

可以期望 EJB 容器軟件一般都會隨 EJB 服務器軟件一起提供,盡管規(guī)范答應分離這些組件。除了提供對運行時服務(如事務處理和安全性)的訪問以外,還期望 EJB 容器包括各種必要工具,來支持 enterprise bean 的安裝、操作和治理。例如,需要有工具解釋 EJB jar 文件的內(nèi)容,有工具生成數(shù)據(jù)庫訪問,來獲得容器提供的持久性,有工具監(jiān)視正在運行的 bean 的行為,以及實現(xiàn)安全性等。

Bean 風格
EJB 組件分為兩種主要類別 -- 會話 bean 和實體 bean。根據(jù) bean 處理狀態(tài)、事務和持久性的方式這些類別還可以進一步細分。會話 bean 通常具有以下屬性:

代表單個客戶機執(zhí)行
可以是事務性的
可以更新共享數(shù)據(jù)庫中的數(shù)據(jù)
生存期相對較短
其生存期通常就是客戶機的生存期
任何持久性數(shù)據(jù)都由 bean 治理
可以依容器的判定予以刪除
會在 EJB 服務器失敗時被刪除
實體 bean 通常具有以下屬性:

代表數(shù)據(jù)庫中的數(shù)據(jù)
是事務性的
答應多個用戶共同訪問
可以長期存在
持久性數(shù)據(jù)可以由容器治理
在 EJB 服務器失敗后能繼續(xù)生存
EJB 規(guī)范對會話 bean 和實體 bean 的說明如下:

“對于客戶機,會話 enterprise bean 是一種非持久性的對象,它實現(xiàn)某些在服務器上運行的業(yè)務邏輯。想像一個會話對象的一種方式是:會話對象是運行在服務器上的客戶機程序的邏輯擴展。會話對象不在多臺客戶機之間共享。

“對于客戶機,實體 enterprise bean 是一種持久性對象,它代表一個存儲在持久性存儲器(例如,一個數(shù)據(jù)庫)中的實體的對象視圖,或者是一個由現(xiàn)有企業(yè)應用程序?qū)崿F(xiàn)的實體。”(Enterprise JavaBeans Specification 1.0)

用一種粗略的說法,會話 bean 代表這樣的操作,它檢索或存儲數(shù)據(jù)以滿足用戶請求;而實體 bean 則代表一種數(shù)據(jù)集,可以訪問這些數(shù)據(jù)集來滿足用戶請求。

會話 bean
最簡單的一種 Enterprise JavaBeans 組件就是無狀態(tài)的會話 bean。因為這些 bean 沒有可以區(qū)分它們的狀態(tài),所有的實例都是完全相同的。容器治理無狀態(tài)會話 bean 的生存周期,其方式是通過創(chuàng)建足夠數(shù)目的此種 bean 來適應客戶機工作負荷,并在不需要它們時將其刪除。鈍化,即將閑置的 bean 寫到磁盤上,不用于無狀態(tài)的會話。要調(diào)用 bean,客戶機程序調(diào)用本地接口中的 standard create() 方法,盡管此操作不一定導致實例化新的 bean 實例。容器可以選擇將客戶機請求發(fā)送給現(xiàn)有的對象。反之,容器則可以按它的選擇創(chuàng)建新的實例,且獨立于由客戶機發(fā)布的 create() 方法。

在 EJB 本地對象上發(fā)布的 create() 調(diào)用返回一個對 EJB 對象的引用,這個 EJB 對象代表 enterprise bean。一旦客戶機有了 EJB 對象引用,它就可以將業(yè)務方法發(fā)布到 EJB 對象上,容器隨之會將這些方法委托給 bean 自身。負責治理會話 bean 的容器組件無需推斷會話 bean 是否是無狀態(tài)的。會話 bean 是無狀態(tài)的還是有狀態(tài)的在安裝時聲明。

假如會話 bean 在方法調(diào)用之間保留狀態(tài)信息,則它是有狀態(tài)的。通過調(diào)用 ejbPassivate() 方法,容器可以依其判定將有狀態(tài)會話 bean 鈍化,或?qū)懙捷o助存儲器中。EJB 規(guī)范并不要求容器在鈍化 bean 時使用 Java 串行化協(xié)議,但是它們必須提供等價的功能。當容器決定將一個非活動的會話 bean 交換回到內(nèi)存中時,它會取消被動 bean 的串行化,并調(diào)用 ejbActivate() 方法。有狀態(tài)會話 bean 的開發(fā)人員負責確保狀態(tài)數(shù)據(jù)是可串行化的。在集群的應用程序服務器環(huán)境中實現(xiàn)有狀態(tài)會話 bean 時務必要小心,因為并不是所有的服務器都支持集群的有狀態(tài)會話 bean 的同步化。

有狀態(tài)會話 bean 可以是事務性的。通過使用 javax.transaction.UserTransaction 接口中的方法,如 begin()、commit() 和 rollback(),bean 可以控制事務;通過實現(xiàn) javax.ejb.SessionSynchronization 接口,bean 可以接收有關(guān)事務狀態(tài)的通知。EJB 容器無需推斷哪些 bean 需要事務支持;UserTransaction 接口僅可用于那些在安裝時被標記為事務性的 bean。

實體 bean
實體 bean 在體系結(jié)構(gòu)上與會話 bean 類似,但它們提供對企業(yè)數(shù)據(jù)的訪問,而不是支持用戶會話。一個實體 bean 可以支持多個并發(fā)用戶,而容器則使訪問和事務同步化。實體 bean 還具有支持本地對象中的 finder 方法的主鍵。知道實體 bean 的主鍵的客戶機可以通過調(diào)用本地對象上的 findBy PrimaryKey() 方法獲得對象引用。與會話 bean 不同,實體 bean 的本地對象除了具有 create 方法外還具有 finder 方法。

持久性是實體 bean 的一個基本屬性。EJB 規(guī)范答應兩種形式的實體持久性:bean 治理的持久性和容器治理的持久性。對于代表關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)的實體 bean,bean 對持久性的治理意味著,對數(shù)據(jù)庫訪問的調(diào)用是直接編寫在企業(yè) bean 的方法中的(使用 JDBC 或 SQLJ)。這種方法是直截了當?shù)模档土丝梢浦残浴H萜鲗Τ志眯缘闹卫硪馕吨?bean 不受數(shù)據(jù)庫調(diào)用的影響。在安裝時告知容器有關(guān) bean 數(shù)據(jù)所需的持久性,而容器負責生成實現(xiàn)持久性的代碼。這種方法答應 bean 的可移植性更高,甚至達到持久性可使用不同數(shù)據(jù)源的程度。然而,此方法要求容器中要有復雜功能。

當實體 bean 對象與 EJB 對象相關(guān)聯(lián)時,前者處于就緒狀態(tài);否則將認為它們處于共享狀態(tài)。當客戶機調(diào)用 EJB 對象中的方法時,容器查找關(guān)聯(lián)的實體 bean 的實例(假如存在的話),或者從共享狀態(tài)中傳送出一個實例。處于就緒狀態(tài)的實體 bean 可以接收到通過委托從客戶機傳播給它們的業(yè)務方法調(diào)用。它們還可以在容器請求時執(zhí)行 ejbLoad() 和 ejbStore() 方法。load 方法和 store 方法旨在維持實體 bean 和基礎(chǔ)數(shù)據(jù)存儲之間數(shù)據(jù)的一致性。

實體 bean 支持多個用戶并發(fā)地訪問數(shù)據(jù)。EJB 規(guī)范聲明,維持數(shù)據(jù)完整性是容器的責任:

“enterprise bean 開發(fā)人員在編寫業(yè)務方法時無需擔心來自多個事務的并發(fā)訪問。enterprise bean 開發(fā)人員在編寫方法時可以假定,對于被多個事務同時訪問的各個實體 bean,將能確保適當?shù)耐交!?Enterprise JavaBeans Specification 1.0)

容器完成這一任務通常是通過鎖定數(shù)據(jù)庫中的數(shù)據(jù),并使訪問串行化,或通過創(chuàng)建實體 bean 的多個實例,并答應在基礎(chǔ)數(shù)據(jù)存儲中使用并發(fā)控制,這樣來治理訪問。

第三部分內(nèi)容預告
“什么是 Enterprise JavaBeans 組件?”的第三部分將討論安裝 EJB 組件的非凡部署過程。它還將說明 CORBA 是否是 EJB 組件的競爭對手(答案是“否” -- 請參閱 EJB 技術(shù)是如何補充 CORBA 的)。最后,您將看到一種基于 EJB 的三層編程模型的使用情況。

參考資料

查閱 Enterprise JavaBeans Specification 1.0。
要了解有關(guān) EJB 體系結(jié)構(gòu)的更多內(nèi)容,請參閱 Anne Thomas 的 Enterprise JavaBeans Technology: Server Component Model for the Java Platform,Patricia Seybold Group。
要了解有關(guān) Java 技術(shù)和 EJB 體系結(jié)構(gòu)的更多內(nèi)容,請訪問 Sun 的網(wǎng)站。

作者簡介
Ken Nordby 是 IBM 軟件開發(fā)實驗室的軟件工程師,該實驗室位于 Research Triangle Park,North Carolina。作為 SWG ProdUCt Affinity Services 業(yè)務小組的成員,Ken 與這樣一些 IBM 人共事,他們?yōu)?IBM 的 WebSphere Application Server(即 Enterprise JavaBeans 技術(shù)的 IBM 實現(xiàn))從事開發(fā)和咨詢工作。可以通過 nordby@us.ibm.com 與 Ken 聯(lián)系

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 三台县| 商城县| 图们市| 白沙| 滨海县| 河池市| 天全县| 兴海县| 香港 | 横峰县| 澄迈县| 缙云县| 中宁县| 锡林浩特市| 叙永县| 苍山县| 阜阳市| 颍上县| 轮台县| 南阳市| 井陉县| 泰和县| 迭部县| 江孜县| 恩施市| 四川省| 合阳县| 教育| 琼结县| 灵山县| 开江县| 蒲城县| 涟源市| 赣州市| 达日县| 密山市| 东乌珠穆沁旗| 那坡县| 大新县| 清丰县| 随州市|