轉(zhuǎn):首局部:EJB 體系結(jié)構(gòu)的歷史與目標(biāo)
發(fā)表時(shí)間:2023-08-15 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]什么是 Enterprise JavaBeans 組件?第一部分:EJB 體系結(jié)構(gòu)的歷史和目標(biāo) 本文概述 Enterprise JavaBeans (EJB) 技術(shù),旨在讓讀者快速理解基本概念。...
什么是 Enterprise JavaBeans 組件?
第一部分:EJB 體系結(jié)構(gòu)的歷史和目標(biāo)
本文概述 Enterprise JavaBeans (EJB) 技術(shù),旨在讓讀者快速理解基本概念。第 1 部分講述 EJB 技術(shù)的歷史和某些目標(biāo)、優(yōu)點(diǎn)和技術(shù)。為了簡(jiǎn)潔明了,有選擇地講述 EJB 技術(shù)的一些關(guān)鍵要素。請(qǐng)注意,雖然 EJB 組件依賴于一些基礎(chǔ)的 Java 服務(wù)(如 Java Transaction Service),但使用 EJB 組件及認(rèn)識(shí)這些組件的好處并不需要掌握這些相關(guān)技術(shù)的知識(shí)。
Enterprise JavaBeans 技術(shù)自 1998 年 3 月問(wèn)世以來(lái)很受好評(píng)。下面這段話就是一個(gè)例子:
“自從兩年多以前問(wèn)世以來(lái),Enterprise JavaBeanstm 技術(shù)在平臺(tái)供應(yīng)商和企業(yè)的開(kāi)發(fā)小組中,同樣都保持著空前的發(fā)展勢(shì)頭。這是因?yàn)?EJBtm 的服務(wù)器端組件模型簡(jiǎn)化了中間件組件的開(kāi)發(fā),這些中間組件都是事務(wù)性的、可伸縮的和可移植的。Enterprise JavaBeans 服務(wù)器通過(guò)為中間件服務(wù)(如事務(wù)處理、安全性、數(shù)據(jù)庫(kù)連接及其他)提供自動(dòng)支持,降低了開(kāi)發(fā)中間件的復(fù)雜程度!保⊿un Microsystems 網(wǎng)站)
Enterprise JavaBeans 這一名稱利用了 Java bean — 這種可移植、可重用的 Java 軟件組件的聲望。Enterprise JavaBeans 技術(shù)把 Java 組件的概念從客戶機(jī)域擴(kuò)展到了服務(wù)器域:這是 Java 技術(shù)成長(zhǎng)過(guò)程中有重大意義的一步,它使 Java 技術(shù)發(fā)展成為一種強(qiáng)健的、可伸縮的環(huán)境,能夠支持以任務(wù)為關(guān)鍵的企業(yè)信息系統(tǒng)。
服務(wù)器上的 Java 應(yīng)用程序
Java 編程語(yǔ)言最初在 Web 開(kāi)發(fā)人員中獲得好評(píng)的一個(gè)原因是,它支持稱為 applet 的可下載 Java 程序。對(duì) Applet 的支持以 Applet 類的形式內(nèi)置到了 1.0 版的 Java Development Kit (JDK) 中。按照 1.0 版的時(shí)間框架,Java 開(kāi)發(fā)是以 applet 和應(yīng)用程序作為中心的。基于 JDK 1.0 版的 Java 讀物都是從 applet 和應(yīng)用程序的角度來(lái)描述 Java 編程的:
“Java 程序由更多的類定義中的某一個(gè)組成,每個(gè)類定義均已編譯成它自已的 Java 虛擬機(jī)對(duì)象代碼的 .class 文件。這些類之一必須定義一個(gè)叫做 main() 的方法,程序就是從這個(gè)方法開(kāi)始運(yùn)行的。想調(diào)用一個(gè) Java 程序,需要運(yùn)行 Java 解釋器 java,并指定包含 main() 方法的類的名稱。請(qǐng)注意 Java applet 并不是一個(gè)應(yīng)用程序 — 它是一個(gè)由已在運(yùn)行的 Java 應(yīng)用程序(如 Web 瀏覽器或 applet 查看器)裝入并運(yùn)行的 Java 類!保ㄒ(jiàn) Flanagan 所著的 Java in a Nutshell)
Java 應(yīng)用程序可以在服務(wù)器上運(yùn)行,但是不管是在客戶機(jī)-服務(wù)器環(huán)境下,還是在基于 Web 的環(huán)境下,JDK 中都沒(méi)有提供讓 Java 應(yīng)用程序?qū)S糜诜⻊?wù)器機(jī)器的接口或包。認(rèn)識(shí)到 Java 在 Web 環(huán)境下作為一種服務(wù)器語(yǔ)言的潛力,Sun Microsystems 編寫(xiě)了 Java Servlet 規(guī)范。servlet 在許多方面與 applet 相似,它是專門為在 Web 服務(wù)器機(jī)器上運(yùn)行而設(shè)計(jì)的 Java 程序:
“servlet 是由容器管理的 Web 組件,可產(chǎn)生動(dòng)態(tài)內(nèi)容。servlet 是一種小型的、與平臺(tái)無(wú)關(guān)的 Java 類,被編譯成體系結(jié)構(gòu)中立的字節(jié)代碼,這種代碼可以動(dòng)態(tài)地加載到一個(gè) web 服務(wù)器上,并由此 web 服務(wù)器運(yùn)行。servlet 通過(guò)一種由 servlet 容器實(shí)現(xiàn)的請(qǐng)求-響應(yīng)模型與 Web 客戶機(jī)進(jìn)行交互。這種請(qǐng)求-響應(yīng)模型建立在超文本傳輸協(xié)議 (HTTP) 行為的基礎(chǔ)之上!保ㄒ(jiàn) JavaSoft 的“Java Servlet API Specification”)
在一臺(tái) Web 服務(wù)器控制下,在多臺(tái)服務(wù)器上運(yùn)行若干小型用戶程序,這種想法并不新鮮 — 一段時(shí)間以來(lái),公共網(wǎng)關(guān)接口 (CGI) 程序(常被稱為 CGI 腳本)一直起著這種作用,并推動(dòng)了 Web 的普及。但 Java servlet 可以以更高的效率和可移植性來(lái)實(shí)現(xiàn)這一目的,因而可望最終會(huì)取代 CGI 程序。為 servlet 提供運(yùn)行時(shí)環(huán)境的軟件(通常被稱為 servlet 引擎)可以添加到現(xiàn)有的、本身并不支持 Java 可執(zhí)行程序的 Web 服務(wù)器上。
Java servlet 的出現(xiàn),為應(yīng)用程序員使用 Java 來(lái)創(chuàng)建 Web 應(yīng)用程序開(kāi)辟了新的途徑。但是,僅有 servlet 還不能為真正的企業(yè)計(jì)算提供完整的模型。CGI 應(yīng)用程序本身往往不是完整的應(yīng)用程序,在處理接收自 Web 瀏覽器上用戶的信息請(qǐng)求時(shí),CGI 只是整個(gè)處理過(guò)程中的一個(gè)中間步驟。例如,CGI 應(yīng)用程序的一種常見(jiàn)用途是訪問(wèn)數(shù)據(jù)庫(kù)。將它用于這種任務(wù)時(shí),CGI 程序提供一種方法,將用戶的數(shù)據(jù)請(qǐng)求連接到能滿足這種請(qǐng)求的企業(yè)數(shù)據(jù)庫(kù)。CGI 程序常常充當(dāng)一種中間軟件,從 Web 瀏覽器接收請(qǐng)求,決定必須調(diào)用哪些計(jì)算資源來(lái)滿足這些請(qǐng)求,并向?yàn)g覽器發(fā)回響應(yīng)。Java servlet 與 CGI 程序一樣,最適合充當(dāng)連接前端 Web 請(qǐng)求與后端數(shù)據(jù)資源的中間層組件。
三層體系結(jié)構(gòu)
Web 編程向服務(wù)器端 Java 應(yīng)用程序的演化,也帶來(lái)了體系結(jié)構(gòu)的演化,使它脫離了常規(guī)的客戶機(jī)-服務(wù)器兩層模型,而向一種三層方法發(fā)展。兩層模型當(dāng)時(shí)曾經(jīng)具有創(chuàng)新意義,因?yàn)樗鼘⒁恍┯?jì)算任務(wù)從主處理器上卸載到靈巧的客戶機(jī)。常規(guī)的基于 LAN 的數(shù)據(jù)庫(kù)應(yīng)用程序就是一個(gè)例子,其中數(shù)據(jù)庫(kù)管理器服務(wù)器軟件駐留在一個(gè)專用的服務(wù)器機(jī)器上,而用戶則通過(guò)他們的工作站上的客戶機(jī)代碼來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。隨著客戶機(jī)-服務(wù)器模型成長(zhǎng)到能付諸使用,就出現(xiàn)了對(duì)服務(wù)器可伸縮性和對(duì)客戶機(jī)代碼大小和復(fù)雜性的關(guān)注。于是提出了一種三層的體系結(jié)構(gòu),以避免在兩層模型中已察覺(jué)到的弱點(diǎn),使 Web 能成為一個(gè)計(jì)算平臺(tái):
“許多人...斷言,傳統(tǒng)的客戶機(jī)/服務(wù)器兩層體系結(jié)構(gòu)不會(huì)有好的可伸縮性,因?yàn)橛脩暨B接和數(shù)據(jù)訪問(wèn)的數(shù)量無(wú)法預(yù)測(cè),而且在一些系統(tǒng)管理上也存在問(wèn)題。為處理兩層體系結(jié)構(gòu)的限制,許多開(kāi)發(fā)集體都在轉(zhuǎn)向三層體系結(jié)構(gòu)。這種體系結(jié)構(gòu)大致可以定義為:客戶機(jī)層上的表示層、中間的服務(wù)器和后端的某種數(shù)據(jù)庫(kù)。這種設(shè)想的目的就是緩和客戶機(jī)或數(shù)據(jù)庫(kù)服務(wù)器上的代碼膨脹,集中管理業(yè)務(wù)邏輯,更靈活地使用數(shù)據(jù)庫(kù),而不僅是使用所存儲(chǔ)的過(guò)程和觸發(fā)器。”(見(jiàn) Kim 的“Looking for a 3-Tier App Builder?”)
一個(gè)三層結(jié)構(gòu)模型通常被想像成有一個(gè) Web 瀏覽器作為客戶層。Web 瀏覽器由于有可能成為一種真正的通用客戶機(jī),使它從觀念上取代了兩層結(jié)構(gòu)的“胖客戶機(jī)”。如果瀏覽器作為 Web 應(yīng)用程序體系結(jié)構(gòu)的標(biāo)準(zhǔn)瘦客戶機(jī)獲得認(rèn)可,那么以前駐留在兩層模型的胖客戶機(jī)中的功能會(huì)怎么樣呢?現(xiàn)在,應(yīng)用程序?qū)S玫墓δ懿⒉灰浦不胤⻊?wù)器(例如數(shù)據(jù)庫(kù)管理器),而是有意將它駐留在一個(gè)新的中間層上。中間層支持應(yīng)用程序服務(wù)器軟件,這種軟件是中間件的一種形式,它處于第一層上瘦客戶機(jī)的最小功能和第三層上服務(wù)器端業(yè)務(wù)系統(tǒng)的豐富功能之間。由于三層體系結(jié)構(gòu)與 Web 處理模型有密切關(guān)系,所以中間層應(yīng)用程序服務(wù)器常被視為 Web 服務(wù)器的一種功能擴(kuò)展,F(xiàn)有的 Web 應(yīng)用程序利用 CGI 程序,將來(lái)自 Web 瀏覽器的用戶請(qǐng)求傳送到不基于 Web 的業(yè)務(wù)系統(tǒng),并向?yàn)g覽器返回響應(yīng),就是三層模型的一種實(shí)現(xiàn)。這些應(yīng)用程序逐漸向 servlet 技術(shù)的轉(zhuǎn)移說(shuō)明三層模型正在增強(qiáng)。
JavaBeans 組件
JavaBeans 規(guī)范將“組件軟件”的概念引入到 Java 編程的領(lǐng)域。組件是自含的、可重用的軟件單元;而 JavaBeans 組件,則可以使用可視的應(yīng)用程序開(kāi)發(fā)工具,可視地將它們編寫(xiě)到 Java 程序中。JavaBeans 規(guī)范為 Java 開(kāi)發(fā)人員提供了一種“組件化”其 Java 類的方法:
Bean 是一些 Java 類,可在一個(gè)可視的構(gòu)建器工具中操作它們,并且可以將它們一起編寫(xiě)到應(yīng)用程序中。任何具有某種特性和事件接口約定的 Java 類都可以是一個(gè) Bean。(見(jiàn) JavaSoft,“Using the Beans Development Kit 1.0”)
如果軟件重用是一個(gè)好主意,那么是否應(yīng)該讓每一個(gè) Java 類都成為 Java bean 呢?如果 Java 類滿足某些準(zhǔn)則,它們就適于充當(dāng) bean 的角色:
在開(kāi)發(fā)任何新軟件之前,都值得考慮是否用 JavaBean 的形式來(lái)開(kāi)發(fā)它。如果軟件模塊要既能夠可視地操作,又能夠定制以達(dá)到某些效果,則這種軟件模塊就可能適于做成一個(gè) JavaBean。為幫助您確定要開(kāi)發(fā)的軟件是否應(yīng)該是一個(gè) JavaBean,假定它應(yīng)該是用 Java 編寫(xiě)的,請(qǐng)向您自已提出以下問(wèn)題,并相應(yīng)地作出決定:
是否打算讓它可重用?或者,它會(huì)是可重用的嗎?
是否希望將它與其他可重用的 Java 組件一起使用?
是否預(yù)計(jì)會(huì)在 IDE 工具中使用它?
如果上述問(wèn)題的答案都是肯定的,則它應(yīng)該作為 JavaBean 來(lái)開(kāi)發(fā)。(見(jiàn) developerWorks 的“JavaBeans Guidelines”)
JavaBean 概念是為了在 Java 編程環(huán)境中支持可重用的組件,它是一種一般性的設(shè)計(jì)方法,適用于客戶機(jī)或服務(wù)器機(jī)器上運(yùn)行的 Java 程序。由于對(duì)可視的構(gòu)建器工具的強(qiáng)調(diào),也由于許多 Java bean 都是圖形用戶界面 (GUI) 組件,所以 JavaBean 組件可能被視為一種客戶端技術(shù)。但是,并不要求 Java bean 都是可視的,并且它們也可以用于服務(wù)器環(huán)境中。
編碼為 Java bean 的 Java 類通常具有以下特征:
使用設(shè)計(jì)模式。這些模式就是方法和接口的編碼約定。
支持可視的軟件開(kāi)發(fā)工具。類必須將變量(稱為屬性)、方法和事件展示出來(lái)。
可以定制。定制包括能支持缺省的屬性編輯器,或者提供單一的定制規(guī)則。定制使開(kāi)發(fā)人員得以在不更改源代碼的情況下更改 bean 的行為。
支持自省 (introspection)。這指的是將屬性、方法和事件公開(kāi)給其他類,可以通過(guò)設(shè)計(jì)模式或通過(guò)創(chuàng)建 BeanInfo 類來(lái)完成這種自省。
是持久的。這就允許在一個(gè)可視構(gòu)建器中定制一個(gè) bean,然后以其定制后的狀態(tài)加以保存。
Java 2 Platform, Enterprise Edition
Sun Microsystems 發(fā)起了一項(xiàng)稱為 Java 2 Platform, Enterprise Edition (J2EE) 的技術(shù)創(chuàng)新,旨在將 Java 平臺(tái)的范圍擴(kuò)展到大規(guī)模服務(wù)器環(huán)境:
“1997 年 4 月 12 日,Sun 宣布了一項(xiàng)為企業(yè)環(huán)境開(kāi)發(fā) Java 平臺(tái)的創(chuàng)新成果。使用開(kāi)放式的 Java Community Process,Sun 促進(jìn)了一組標(biāo)準(zhǔn)的 Java 擴(kuò)展的開(kāi)發(fā),稱為 Enterprise Java API。這些應(yīng)用程序編程接口 (API) 為各種各樣的中間件的實(shí)現(xiàn)提供了不依賴供應(yīng)商的編程接口。Enterprise Java API 的要點(diǎn)是 Enterprise JavaBeans API,后者為 Java 應(yīng)用程序服務(wù)器定義了一個(gè)服務(wù)器端組件模型,以及一個(gè)不依賴供應(yīng)商的編程接口!保ㄒ(jiàn) Thomas 的“Java 2 Platform, Enterprise Edition: Ensuring Consistency, Portability, and Interoperability”)
J2EE 為 Enterprise JavaBeans 技術(shù)提供了工作環(huán)境。事實(shí)上,Sun 把若干項(xiàng)軟件技術(shù)都設(shè)想為這樣的構(gòu)件塊,它們將使大型企業(yè)能夠把以任務(wù)為關(guān)鍵的業(yè)務(wù)系統(tǒng)移植到 Java 環(huán)境中,而 Enterprise JavaBeans 技術(shù)不過(guò)是這些技術(shù)之一。EJB 組件是按它們自己的規(guī)范定義的,但 EJB 技術(shù)并不是一項(xiàng)獨(dú)立的技術(shù)。它建立在其他 Java 技術(shù)之上,這些技術(shù)由 Sun 和其他 IT 公司聯(lián)合規(guī)定,它們一起提供了這個(gè)框架的內(nèi)容,該框架就稱為 Java 2 Platform, Enterprise Edition。
J2EE 中包括以下技術(shù):
Enterprise JavaBeans (EJB) 技術(shù)
Java Interface Definition Language (IDL)
Java Message Service (JMS) API
Java Naming and Directory Interface (JNDI)
Java Remote Method Invocation (RMI) 和 Object Serialization
Java Servlet API
Java Transaction API (JTA)
Java Transaction Service (JTS)
JavaServer Pages (JSP) 技術(shù)
JDBC 數(shù)據(jù)庫(kù)訪問(wèn) API
參與到這個(gè)企業(yè) Java 框架中,并不意味著每項(xiàng)技術(shù)都依賴于所有其他技術(shù)。單獨(dú)的規(guī)范文檔指出每項(xiàng)技術(shù)的相關(guān)性。例如,Enterprise JavaBeans 規(guī)范 1.0 發(fā)行版就指明了在定位各個(gè)組件時(shí)與 JNDI 的相關(guān)性,以及在編程中啟動(dòng)和停止事務(wù)處理時(shí)與 JTA 的相關(guān)性。
EJB 技術(shù)的設(shè)計(jì)目標(biāo)
EJB 規(guī)范的第一版以初稿形式于 1997 年 12 月公布,并于 1998 年 3 月作為 1.0 版發(fā)行。規(guī)范作者為 EJB 體系結(jié)構(gòu)制定了以下目標(biāo):
Enterprise JavaBeans 體系結(jié)構(gòu)將是標(biāo)準(zhǔn)的組件體系結(jié)構(gòu),用于以 Java 編程語(yǔ)言構(gòu)建分布式的面向?qū)ο蟮纳虅?wù)應(yīng)用程序。通過(guò)把使用不同供應(yīng)商提供的工具開(kāi)發(fā)出來(lái)的組件組合在一起,Enterprise JavaBeans 體系結(jié)構(gòu)將有可能構(gòu)建分布式的應(yīng)用程序。
Enterprise JavaBeans 體系結(jié)構(gòu)將使編寫(xiě)應(yīng)用程序變得容易:應(yīng)用程序開(kāi)發(fā)人員將不必了解低層次的事務(wù)和狀態(tài)管理的細(xì)節(jié)、多線程、資源共享和其他復(fù)雜的低級(jí) API。但是,將允許專家級(jí)的程序員直接訪問(wèn)低級(jí) API。
Enterprise JavaBeans 應(yīng)用程序?qū)⒆裱?Java 編程語(yǔ)言的“一次編寫(xiě),隨處運(yùn)行”的原則。EJB 組件可以只開(kāi)發(fā)一次,然后在多個(gè)平臺(tái)上部署,而不需要重新編譯或修改源代碼。
Enterprise JavaBeans 體系結(jié)構(gòu)將處理企業(yè)應(yīng)用程序生命周期中的開(kāi)發(fā)、部署和運(yùn)行等方面。
Enterprise JavaBeans 體系結(jié)構(gòu)將定義一些約定,這些約定使多個(gè)供應(yīng)商提供的工具能夠開(kāi)發(fā)并部署可在運(yùn)行時(shí)互操作的組件。
Enterprise JavaBeans 體系結(jié)構(gòu)將與現(xiàn)有的服務(wù)器平臺(tái)兼容。供應(yīng)商將能夠擴(kuò)展它們的現(xiàn)有產(chǎn)品,以支持 Enterprise JavaBeans 組件。
Enterprise JavaBeans 體系結(jié)構(gòu)將與 Java 編程語(yǔ)言編寫(xiě)的其他 API 兼容。
Enterprise JavaBeans 體系結(jié)構(gòu)將提供 EJB 組件和非 Java 編程語(yǔ)言應(yīng)用程序之間的互操作性。
Enterprise JavaBeans 體系結(jié)構(gòu)將與 CORBA 兼容。
使用 EJB 技術(shù)的好處
這些設(shè)計(jì)目標(biāo)會(huì)使企業(yè)和開(kāi)發(fā)人員得到什么好處呢?下面列出了可望從采用 Enterprise JavaBeans 環(huán)境獲得的好處:
EJB 組件使編寫(xiě)應(yīng)用程序更為簡(jiǎn)單。盡管 EJB 體系結(jié)構(gòu)復(fù)雜,但應(yīng)用程序開(kāi)發(fā)人員一般都不必再編寫(xiě)用于訪問(wèn)系統(tǒng)服務(wù)的代碼。一種稱為 EJB 容器的系統(tǒng)組件使系統(tǒng)服務(wù)可用于 EJB 組件的任務(wù)。
服務(wù)器端商務(wù)邏輯可以移植。除了 Java 語(yǔ)言固有的可移植性外,EJB 體系結(jié)構(gòu)還在 bean 和支持該 bean 的容器之間提供了一套標(biāo)準(zhǔn)化的應(yīng)用程序編程接口。這使開(kāi)發(fā)人員能夠?qū)?bean 從一種操作環(huán)境移植到另一種操作環(huán)境,而無(wú)須重新編寫(xiě)其源代碼。
可以從現(xiàn)有的軟件組件裝配出服務(wù)器端應(yīng)用程序,這與從現(xiàn)有的 Java bean 可以裝配出客戶端應(yīng)用程序一樣,從而使軟件能夠重用。
EJB 體系結(jié)構(gòu)內(nèi)置了對(duì)典型企業(yè)級(jí)系統(tǒng)服務(wù)的支持,包括分布式對(duì)象、事務(wù)處理、數(shù)據(jù)庫(kù)、安全和全局命名。
多家 IT 供應(yīng)商都采納 EJB 體系結(jié)構(gòu),這是由于有這樣的承諾:客戶將能夠從選定的供應(yīng)商那里選購(gòu)軟件組件,如 EJB 組件、容器及 EJB 服務(wù)器;也由于承諾了不同供應(yīng)商的產(chǎn)品,只要符合 EJB 體系結(jié)構(gòu),就都是可互操作的。
用 EJB 組件構(gòu)建的應(yīng)用程序可以從一個(gè)服務(wù)器移植到另一個(gè)服務(wù)器,從而支持可伸縮性,這是因?yàn)樵?EJB 模型中,各個(gè)軟件組件都是嚴(yán)格分離的。
EJB 體系結(jié)構(gòu)能保障原有的 IT 投資,這是通過(guò)允許將現(xiàn)有的信息系統(tǒng)和資產(chǎn)“包裹”在這些應(yīng)用程序中,而不要求客戶更換現(xiàn)有技術(shù)。事實(shí)上,在關(guān)系數(shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù)的企業(yè)已經(jīng)有了一套已有雛形的實(shí)體 bean,正等著通過(guò) EJB 外殼去訪問(wèn)。
進(jìn)一步考察 JNDI
Enterprise JavaBeans 組件使用 Java Naming and Directory Interface (JNDI) 來(lái)訪問(wèn)各種目錄服務(wù)。JNDI 分兩部分:應(yīng)用程序編程接口 (API) 和服務(wù)供應(yīng)商接口 (SPI):
“JNDI 體系結(jié)構(gòu)由 JNDI API 和 JNDI SPI 組成。JNDI API 允許 Java 應(yīng)用程序訪問(wèn)各種命名和目錄服務(wù)。JNDI SPI 則是設(shè)計(jì)來(lái)供任意一種服務(wù)的供應(yīng)商(也包括目錄服務(wù)供應(yīng)商)使用。這使得各種各樣的目錄服務(wù)和命名服務(wù)能夠透明地插入到使用 JNDI API 的 Java 應(yīng)用程序中。(見(jiàn) JavaSoft,“JNDI: Java Naming and Directory Interface”)
JNDI API 并不同某種專用的命名技術(shù)或目錄技術(shù)連在一起,也不同任何供應(yīng)商的目錄服務(wù)連在一起,因此它對(duì) EJB 組件的可移植性有所貢獻(xiàn)。例如,客戶可以從多種不同的技術(shù)中選擇,來(lái)為其 EJB 應(yīng)用程序提供目錄服務(wù),這些技術(shù)包括:
LDAP:Sun 的 LDAP 服務(wù)供應(yīng)商支持 LDAP 協(xié)議的第 2 版和第 3 版。
NIS:Sun 提供一個(gè) NIS 服務(wù)供應(yīng)商(NIS 即網(wǎng)絡(luò)信息服務(wù),以前稱為黃頁(yè))。
COS 命名:Sun 的 COS 命名服務(wù)供應(yīng)商提供對(duì) CORBA 命名服務(wù)的訪問(wèn)。
文件系統(tǒng):Sun 提供一個(gè)服務(wù)供應(yīng)商來(lái)訪問(wèn)文件系統(tǒng)。
RMI 注冊(cè):Sun 為 RMI 注冊(cè)提供一個(gè)服務(wù)供應(yīng)商。
Novell:有幾個(gè)服務(wù)供應(yīng)商可提供對(duì)目錄服務(wù) NDS 的訪問(wèn)以及 NetWare 3X 連接庫(kù)、Novell 文件系統(tǒng)和其他 Novell 服務(wù)(如擴(kuò)展 NCP)的訪問(wèn)。
雖然 JNDI 規(guī)范對(duì)供應(yīng)商是中立的,但不應(yīng)認(rèn)為,實(shí)現(xiàn) JNDI 接口的應(yīng)用程序服務(wù)器一定要能訪問(wèn)來(lái)自多個(gè)供應(yīng)商的服務(wù)供應(yīng)商代碼。
JNDI 命名體系結(jié)構(gòu)的關(guān)鍵概念包括:
對(duì)象和名稱之間的綁定。
若干稱為命名上下文的綁定集。
命名系統(tǒng),即若干組命名上下文。
命名空間,指一個(gè)命名系統(tǒng)中的所有名稱。
名稱分類為原子名稱、復(fù)合名稱和合成名稱。原子名稱是不可分割的,可以綁定到一個(gè)對(duì)象上。復(fù)合名稱是原子名稱的組合,而合成名稱則跨越多個(gè)命名系統(tǒng)。
命名上下文特別重要:所有的命名操作均是在上下文對(duì)象上進(jìn)行的,并且名稱解析過(guò)程總是從最初的命名上下文開(kāi)始。
EJB 應(yīng)用程序是如何使用 JNDI 的呢?JNDI 的主要用途是檢索對(duì) EJB 組件的引用。因?yàn)?EJB 框架是一個(gè)分布式對(duì)象框架,所以 EJB 應(yīng)用程序不應(yīng)當(dāng)假定 EJB 組件的位置。JNDI 就是獲取對(duì) bean 的起始引用的一種機(jī)制。當(dāng)一個(gè) bean 安裝到一個(gè) enterprise bean 服務(wù)器上時(shí),一個(gè)被稱為 EJB 容器的軟件組件就負(fù)責(zé)創(chuàng)建各個(gè)名稱-對(duì)象綁定,使所需的 Java 類文件能使用這個(gè) bean。應(yīng)用程序使用 JNDI 的查找方法來(lái)檢索對(duì)象引用,如下例所示:
Context initialContext = new InitialContext( );
CartHome cartHome = javax.rmi.PortableRemoteObject.narrow(
initialContext.lookup("applications/shopping_cart"), CartHome.class);
應(yīng)用程序有責(zé)任知道外部名稱,應(yīng)用程序就是通過(guò)這個(gè)名稱才得以引用一個(gè) enterprise bean,并通過(guò) JNDI 來(lái)獲取對(duì)該 bean 的引用的。
進(jìn)一步考察 JTA
除 JNDI 以外,Enterprise JavaBeans 體系結(jié)構(gòu)還使用 Java Transaction API (JTA)。因?yàn)槭聞?wù)對(duì)維護(hù)數(shù)據(jù)完整性和可靠性很重要,所以支持事務(wù)處理是 EJB 體系結(jié)構(gòu)的一個(gè)基本部分。如果企業(yè)應(yīng)用程序是分布式的,事務(wù)處理就會(huì)更加重要:
“事務(wù)的概念是一個(gè)重要的編程范例,其目的在于簡(jiǎn)化既要求可靠性又要求可用性的應(yīng)用程序結(jié)構(gòu),特別是那些需要同時(shí)訪問(wèn)共享數(shù)據(jù)的應(yīng)用程序。事務(wù)的概念最早是用在商務(wù)運(yùn)作的應(yīng)用程序中,其中它被用于保護(hù)集中式數(shù)據(jù)庫(kù)中的數(shù)據(jù)。后來(lái),事務(wù)的概念已擴(kuò)展到分布式計(jì)算的更廣泛的環(huán)境中。今天,事務(wù)是構(gòu)建可靠的分布式應(yīng)用程序的關(guān)鍵,這一點(diǎn)已得到廣泛承認(rèn)。”(見(jiàn)對(duì)象管理組的“Transaction Service Specification”)
有時(shí)將事務(wù)描述為具有下列特征的工作單元:
原子性 — 如果因故障而中斷,所有結(jié)果均撤銷
一致性 — 事務(wù)的結(jié)果保留不變的特性
孤立性 — 中間狀態(tài)對(duì)其他事務(wù)是不可見(jiàn)的
持久性 — 已完成的事務(wù)的結(jié)果是持久的
事務(wù)的終止有兩種方式:提交一個(gè)事務(wù)會(huì)使其所有的更改永久不變,而回滾 (rolling back) 一個(gè)事務(wù)則撤銷其所有的更改。
對(duì)象管理組織 (OMG) 為一種面向?qū)ο蟮氖聞?wù)服務(wù),即對(duì)象事務(wù)服務(wù) (OTS),創(chuàng)建了一種規(guī)范。OTS 是 EJB 體系結(jié)構(gòu)內(nèi)的事務(wù)服務(wù)的基礎(chǔ)。下列事務(wù)規(guī)范就是為 enterprise bean 所采用的事務(wù)模型而設(shè):
OMG 的對(duì)象事務(wù)服務(wù) (OTS)
Sun Microsystems 的 Transaction Service (JTS)
Sun Microsystems 的 Java Transaction API (JTA)
開(kāi)放組 (X/Open) 的 XA 接口
這種與語(yǔ)言無(wú)關(guān)的對(duì)象事務(wù)服務(wù),為一個(gè)強(qiáng)健的分布式事務(wù)服務(wù)提供了基本概念、定義和功能。
Java Transaction Service 是 OTS 的 Java 映射,在 org.omg.CosTransactions 和 org.omg.CosTSPortability 這兩個(gè)包中定義。JTS 對(duì)事務(wù)分界和事務(wù)環(huán)境的傳播之類的服務(wù)提供支持。JTS 功能由應(yīng)用程序通過(guò) Java Transaction API 訪問(wèn)。
Java Transaction API 指定事務(wù)管理器與分布式事務(wù)中涉及的其他系統(tǒng)組件之間的各種高級(jí)接口,這些系統(tǒng)組件有應(yīng)用程序、應(yīng)用程序服務(wù)器和資源管理器等。JTA 功能允許事務(wù)由應(yīng)用程序本身、由應(yīng)用程序服務(wù)器或由一個(gè)外部事務(wù)管理器來(lái)管理。JTA 接口包含在 javax.transaction 和 javax.transaction.xa 這兩個(gè)包中。
XA 接口定義了資源管理器和分布式事務(wù)環(huán)境中外部事務(wù)管理器之間的約定。外部事務(wù)管理器可以跨多個(gè)資源協(xié)調(diào)事務(wù)。XA 的 Java 映射包含在 Java Transaction API 中。