企業(yè)JavaBeansTM技術(shù)說明 -- 獻(xiàn)給不知道EJB為何物的兄弟們
發(fā)表時間:2024-06-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]企業(yè)JavaBeansTM技術(shù)介紹今天, 對企業(yè)開發(fā)人員來講, 難以編寫分布式商務(wù)應(yīng)用程序和其它任何較大的應(yīng)用程序是他們所面臨著一個共同問題。如果一個應(yīng)用程序是分布式的,或在網(wǎng)絡(luò)中以多重形式出現(xiàn),那它必然應(yīng)該是一個綜合化的產(chǎn)物。如果一個應(yīng)用程序必須可靠而有保證地執(zhí)行它的商務(wù)邏輯, 那么其綜合化程度...
企業(yè)JavaBeansTM技術(shù)介紹
今天, 對企業(yè)開發(fā)人員來講, 難以編寫分布式商務(wù)應(yīng)用程序和其它任何較大的應(yīng)用程序是他們所面臨著一個共同問題。如果一個應(yīng)用程序是分布式的,或在網(wǎng)絡(luò)中以多重形式出現(xiàn),那它必然應(yīng)該是一個綜合化的產(chǎn)物。如果一個應(yīng)用程序必須可靠而有保證地執(zhí)行它的商務(wù)邏輯, 那么其綜合化程度又必然需要進(jìn)一步提高。
企業(yè)所面臨的另一個復(fù)雜問題是企業(yè)自身的基本操作環(huán)境也是多種多樣的。另外, 企業(yè)希望能以盡可能快的速度建立自己的應(yīng)用程序, 而不是被限制在單一的平臺上。理想的情況是, 企業(yè)開發(fā)人員只編寫一次應(yīng)用程序, 而該程序即可在任意平臺上運行。企業(yè)JavaBeansTM技術(shù)就是希望提供這種能力。
企業(yè)JavaBeans(EJB)的組件結(jié)構(gòu)是以作為可重復(fù)使用的服務(wù)器端組件而設(shè)計的,它使企業(yè)能夠建立可升級、安全可靠、可運行于多重平臺且以商務(wù)為重點的應(yīng)用程序。本文描述了EJB組件模型的含義和結(jié)構(gòu),并且給出了一個EJB組件如何工作的實例。
什么是企業(yè)JavaBeans技術(shù)?
EJB技術(shù)的設(shè)計目標(biāo)
企業(yè)應(yīng)用程序模型
特性
開發(fā)人員的角色分配
開發(fā)過程
EJB的未來
結(jié)論
什么是企業(yè)JavaBeans技術(shù)?
EJB結(jié)構(gòu)是JavaTM平臺上的服務(wù)器端組件模型。設(shè)計EJB結(jié)構(gòu)的目的是, 通過使企業(yè)開發(fā)人員將注意力只集中于編寫商務(wù)邏輯, 從而解決上面所提出的問題。EJB技術(shù)取消了編寫"全程(plumbing)" 碼的要求。例如, 企業(yè)開發(fā)人員不再需要編寫那些處理事務(wù)行為、安全、連接共享或線程的代碼, 因為EJB體系結(jié)構(gòu)將這些任務(wù)委托給服務(wù)器廠商完成了。
對用戶和這一技術(shù)的實現(xiàn)者來說, 將會獲得如下收益:
生產(chǎn)效率: 使用這一技術(shù), 企業(yè)開發(fā)人員將會進(jìn)一步提高生產(chǎn)效率。他們不僅能夠獲得在Java平臺上的開發(fā)成果, 而且能夠?qū)⒆⒁饬杏谏虅?wù)邏輯, 從而使效率倍增。
業(yè)內(nèi)支持: 試圖建立EJB系統(tǒng)的客戶會獲得一系列可供選擇的解決方案。企業(yè)JavaBeans技術(shù)已經(jīng)被多達(dá)25個公司所接受、支持和應(yīng)用。
投資保護(hù): 企業(yè)JavaBeans技術(shù)建立在企業(yè)現(xiàn)存系統(tǒng)之上。事實上, 許多EJB產(chǎn)品都將建立在已有的企業(yè)系統(tǒng)之上。今天企業(yè)所使用的系統(tǒng), 明天將會運行企業(yè)JavaBeans組件。
結(jié)構(gòu)獨立: 企業(yè)JavaBeans技術(shù)將開發(fā)人員和底層中間件相隔離; 開發(fā)人員看到的僅僅是Java平臺。 這一點除下面將要談到的交叉平臺的好處外, 還將使得EJB服務(wù)器廠商在不干擾用戶的EJB應(yīng)用程序的前提下, 有機(jī)會改進(jìn)中間件層。
服務(wù)器端僅寫一次, 即可隨處運行(Server-Side Write Once, Run AnywhereTM): 通過對Java平臺的支持, EJB技術(shù)將"僅寫一次, 隨處運行"的概念提高到了一個新的水平。它可以保證一個EJB應(yīng)用程序可運行于任何服務(wù)器, 只要這個服務(wù)器能夠真正提供企業(yè)JavaBeans APIs。
EJB技術(shù)的設(shè)計目標(biāo)
服務(wù)器端環(huán)境和其所需工具極大地影響了EJB技術(shù)的設(shè)計目標(biāo)。 一個主要的設(shè)計目標(biāo)是減少(盡可能地)建立分布式應(yīng)用程序的過程;它是通過將一般需要手工編碼的特性轉(zhuǎn)化為企業(yè)Beans簡單聲明屬性來實現(xiàn)的, 這些聲明屬性使開發(fā)效率大大提高, 因為某些行為, 如安全和事務(wù)不是以代碼形式, 而是通過Bean自身的"標(biāo)記" 來設(shè)定的,。這種設(shè)計特性也是EJB技術(shù)使開發(fā)人員將注意力集中于編寫商務(wù)邏輯的另一條途徑。
EJB規(guī)范創(chuàng)建了一種底層結(jié)構(gòu), 它關(guān)系到系統(tǒng)級編程, 如事務(wù)、安全、線程、命名、對象生命周期、資源共享、遠(yuǎn)程訪問和persistence等等;它同時也簡化了訪問現(xiàn)存應(yīng)用程序的過程, 并為工具的創(chuàng)建和使用提供了統(tǒng)一的應(yīng)用程序開發(fā)模型。
企業(yè)應(yīng)用程序模型
除提供底層結(jié)構(gòu)以外, EJB技術(shù)還涉及到另外一個問題。有兩種建立企業(yè)應(yīng)用程序的基本模型。在第一個模型中, 客戶是從作為一個應(yīng)用程序的對象開始對話期的; 該對象可代表客戶執(zhí)行一項工作, 有可能包括多重數(shù)據(jù)庫事務(wù);在第二個模型中, 客戶訪問一個對象, 這個對象代表了數(shù)據(jù)庫中的一個實體。EJB的設(shè)計適用性很廣, 它包括了這兩種模型:
Session Beans包括了第一種模型。一個Session Bean是一個對象, 它代表了與客戶的一個瞬時對話, 并為客戶執(zhí)行數(shù)據(jù)庫讀寫操作;這些數(shù)據(jù)庫的訪問是在一個事務(wù)處理過程中實現(xiàn)的。一個Session Bean的字段包括對話的狀態(tài)且是瞬時的,之所以如此的意義在于, 一旦服務(wù)器或客戶崩潰, Session Beans就不存在了。該模型典型地用于數(shù)據(jù)庫編程語言, 如PL/SQL。
Entity Beans包括了第二種模型。一個Entity Bean與作用于一個數(shù)據(jù)庫中的數(shù)據(jù)的方法一起代表了這些數(shù)據(jù)。在關(guān)系型數(shù)據(jù)庫中, 例如一個雇員信息表格, 表中的每一行都有一個Bean。Entity Beans是事務(wù)型的且長壽, 只要數(shù)據(jù)庫中的數(shù)據(jù)存在, 則Entity Bean就存在。該模型大多數(shù)典型地應(yīng)用于面向?qū)ο蟮臄?shù)據(jù)庫中。
請注意在EJB規(guī)范中, 支持Session Beans是強(qiáng)制性的, 而支持Entity Beans在目前是選擇性的; 但在EJB規(guī)范2.0版中, 它將成為強(qiáng)制性的。
EJB 結(jié)構(gòu)
上圖顯示了EJB技術(shù)的體系結(jié)構(gòu)。EJB規(guī)范支持任何類型的客戶, 因為該規(guī)范不強(qiáng)制要求任何遠(yuǎn)程對象的"網(wǎng)線"協(xié)議;這就意味著一個服務(wù)器可支持多種協(xié)議, 如RMI、IIOP(CORBA)和DCOM等;它也說明, 一個EJB服務(wù)器的客戶程序不一定要用Java語言來編寫。
EJB服務(wù)器實際是各種支持EJB安裝的服務(wù)的集合, 這些服務(wù)包括分布式事務(wù)管理、分布式對象管理和對這些對象的分布式調(diào)用以及低層次系統(tǒng)服務(wù)。簡而言之, EJB服務(wù)器管理那些支持EJB組件所需要的資源。一個EJB服務(wù)器提供商可提供一個容器的實現(xiàn)(詳情見后), 他也可以為第三方廠商提供API以使其能嵌入附加EJB容器。EJB規(guī)范在服務(wù)器的設(shè)計和實現(xiàn)上給了開發(fā)人員以極大的自由。
EJB服務(wù)器正象是EJB組件的一個家, 而容器則是Bean生活的地方, 就象是一個記錄"生活"在數(shù)據(jù)庫中一樣。它提供了一個可升級、安全和事務(wù)性的環(huán)境, 在該環(huán)境中Bean可以操作。處理對象生命周期(包括創(chuàng)建和銷毀一個對象)的正是容器。容器也負(fù)責(zé)Bean的狀態(tài)管理。
容器對客戶是透明的, 容器上沒有客戶API。當(dāng)一個Bean被安裝在容器中時, 該容器提供兩種實現(xiàn): Bean的EJBHome接口的實現(xiàn)(詳情見后)和Bean的遠(yuǎn)程接口的實現(xiàn)。容器也負(fù)責(zé)保證在JavaJNDI 中能夠獲得Bean的EJBHome接口。
要構(gòu)造一個Bean, 你必須首先實現(xiàn)商務(wù)方法。 例如, 如果你正在編寫一個帳目檢查Bean, 你可能要實現(xiàn)一個"借方"方法用來作為接口的一部分;你還必須實現(xiàn)兩種類型的EJB接口之一 --Session Bean或Entity Bean;這些接口包括了諸如與工作設(shè)置管理相關(guān)的方法并且不暴露給客戶。
當(dāng)把一個Bean安裝在服務(wù)器上時, 遠(yuǎn)程接口(在CORBA中通常稱作skeleton)則被自動生成。遠(yuǎn)程接口的實現(xiàn)被稱為EJBObject, 它只將程序員指定的遠(yuǎn)程接口暴露出來。盡管企業(yè)Bean類包含了同樣的方法, 但它并不實現(xiàn)遠(yuǎn)程界面。 EJBObject的作用就象是一個代理人, 它截取遠(yuǎn)程對象調(diào)用并調(diào)用企業(yè)Bean實例中的適當(dāng)?shù)姆椒ā?
一個EJB容器可實現(xiàn)安裝在該容器中的每個企業(yè)Bean的EJBHome接口, 它允許Bean的創(chuàng)建和清除, 并且可查詢有關(guān)Bean的信息或"元數(shù)據(jù)"。該容器使客戶通過JNDI便可獲得EJBHome接口。對Entity Beans來說, EJBHome接口也包含了一個或多個"finder"方法, 使客戶用一個主鍵即可查詢有關(guān)Bean的信息。
特性
應(yīng)用程序開發(fā)人員所面臨的最復(fù)雜的問題之一是編寫分布式事務(wù)應(yīng)用程序。EJB技術(shù)的一個主要特性就是它對分布式事務(wù)的支持;EJB技術(shù)使你可編寫訪問跨越多個EJB服務(wù)器的多重分布式數(shù)據(jù)庫的應(yīng)用程序。為使這一工作變得簡單, EJB規(guī)范允許你在部署階段就以聲明的形式指出事務(wù)行為, 而管理事務(wù)行為的負(fù)擔(dān)被轉(zhuǎn)移給服務(wù)器, 特別是轉(zhuǎn)移給容器和EJB服務(wù)器提供者。如果Bean的開發(fā)人員有更高的事務(wù)需求, 則可使Bean通過程序來管理事務(wù)界限。
安全是所有企業(yè)產(chǎn)品的需求。EJB組件模型充分發(fā)揮了核心Java平臺安全模型的作用, 從而給予你兩種設(shè)置安全的方法。第一, 你可以在Bean的EJB-JAR文件中設(shè)置安全描述符; 第二, 你可以使用java.security包實現(xiàn)對安全的程序化管理。
EJB的另一個設(shè)計特性是獨立于對象的通信協(xié)議。這有許多好處, 首先, 它可以使編寫客戶端應(yīng)用程序的程序員免于選擇通信協(xié)議; 其次, 它允許EJB服務(wù)器的建立者實現(xiàn)對其用戶最為重要的協(xié)議。例如, ORB提供者可能僅僅實現(xiàn)CORBA協(xié)議, 而UNIX提供者則可能實現(xiàn)RMI和CORBA協(xié)議。但無論如何, 所用協(xié)議對Bean的開發(fā)人員是透明的, 他僅僅針對Java平臺來編寫程序。
Java平臺為EJB服務(wù)器提供了許多繼承性的優(yōu)點。最明顯的一點是, 一旦基于Bean的應(yīng)用程序編成后, 它便可以在任何可運行企業(yè)Bean服務(wù)器的地方運行;其連帶的優(yōu)點是升級性。如果你目前的EJB應(yīng)用程序在性能上出了問題, 你可以將應(yīng)用程序的主要部分移植到另一個更高性能的平臺的EJB服務(wù)器上。
專用容器可大大簡化對現(xiàn)存企業(yè)應(yīng)用程序的訪問。這樣的容器可使現(xiàn)存非Java語言應(yīng)用程序作為Bean出現(xiàn), 它使Java開發(fā)人員可在不了解現(xiàn)存系統(tǒng)和應(yīng)用程序特點的情況下訪問那些應(yīng)用程序。
開發(fā)人員的角色分配
EJB技術(shù)將開發(fā)人員分成固有的五種角色: 服務(wù)器提供者、 容器提供者、 企業(yè)Beans提供者、 應(yīng)用程序裝配者和部署者。對上述五種角色描述如下:
服務(wù)器提供者是分布式事務(wù)管理方面的專家, 主要負(fù)責(zé)處理分布式對象和低層次系統(tǒng)服務(wù)。數(shù)據(jù)庫和TP監(jiān)控器廠商可典型地充當(dāng)該角色。
容器提供者一般是系統(tǒng)編程方面的專家, 由于容器有能力將EJB環(huán)境與現(xiàn)存應(yīng)用程序(如SAP R/3和CICS)橋接起來, 因而這些專家有可能具備某一應(yīng)用領(lǐng)域的經(jīng)驗。由于容器為Bean提供了安全、可升級和事務(wù)性的環(huán)境, 因而容器提供者需具備這些領(lǐng)域的經(jīng)驗。數(shù)據(jù)庫和事務(wù)服務(wù)器廠商也適合這一角色, 并可提供標(biāo)準(zhǔn)容器。
企業(yè)Beans提供者為EJB應(yīng)用程序提供"積木", 他們是典型的以Bean的形式編寫商務(wù)邏輯的域?qū)<?而他們不一定是數(shù)據(jù)庫或系統(tǒng)編程方面的專家。他們生成包括所有組件在內(nèi)的EJB JAR文件。對象庫廠商適合這一角色。
應(yīng)用程序裝配者是域?qū)<? 他們的工作是用第三方Beans建立應(yīng)用程序, 他們也有可能建立客戶端GUI。典型的應(yīng)用程序裝配者通常是程序員,他們建立應(yīng)用程序來可訪問已部署的組件。
部署者通常熟悉企業(yè)的操作環(huán)境, 他們利用應(yīng)用程序包并設(shè)置部分或全部應(yīng)用程序的安全和事務(wù)描述符。部署者也有可能使用工具來修正Bean的商務(wù)邏輯。
開發(fā)過程
值得注意的是, 有幾種不同的建立EJB應(yīng)用程序和組件的方案。開發(fā)過程的不同主要取決于是否編寫session Bean、entity Bean和應(yīng)用程序或上述三項的某種組合。
考慮一個有關(guān)帳目檢查并編寫session Bean的簡單方案。 建立EJB組件的開發(fā)過程是簡單的: 首先, 你應(yīng)該使用IDE(如Java Workshop, Cafe 或JBuilder)為你的Bean或基于Bean的應(yīng)用程序編寫商務(wù)邏輯;編譯后, Beans被打包到一個EJB JAR文件中, 它與常規(guī)的JAR文件相似, 但包含了一個序列化的DeploymentDescriptor類實例, 其中包括了對安全、事務(wù)行為等的設(shè)置;然后, 你應(yīng)該使用服務(wù)器廠商提供的部署工具在EJB服務(wù)器上安裝Bean。至此, 部署者(如數(shù)據(jù)庫管理員)將設(shè)置Bean在特定站點的屬性, 如事務(wù)模式或安全等級。一旦Bean被安裝到了服務(wù)器上, 則客戶可調(diào)用實例的遠(yuǎn)程方法。
請看一個有關(guān)電子商務(wù)的例子-- 一個網(wǎng)上"購物車"?紤]一下你將如何建立一個購物車Bean? 或許你應(yīng)該從建立Bean的遠(yuǎn)程接口開始:
public interface ShoppingCart extends javax.ejb.EJBObject{
boolean addItem(int itemNumber) throws
java.rmi.RemoteException;
boolean purchase() throws java.rmi.RemoteException;
}
這個接口定義了兩個方法: additem()用于向購物車中增加物品, purchase()用于完成這筆交易。一旦公共接口的定義完成,我們必須編寫B(tài)ean的類:
public class ShoppingCartEJB implements SessionBean{
public boolean addItem(int itemNumber){
// the code for adding items to the cart
// may include JDBC code.
}
public boolean purchase(){
//the code for purchases
}
public ejbCreate(String accountName, String account){
// object initialization code
}
}
請注意, 企業(yè)Bean類不實現(xiàn)Bean的遠(yuǎn)程接口, 它是由EJBObject來完成的。另外, session Bean不支持自動的persistence。因而, 顯式數(shù)據(jù)庫訪問必須在其方法中實現(xiàn)。例如, 在purchase()方法中, JDBCTM調(diào)用可被用來更新數(shù)據(jù)庫, 而由容器在安裝時生成的EJBObject可實現(xiàn)遠(yuǎn)程接口;EJBObject的作用就象是一個"代理人", 它將方法調(diào)用傳遞給安裝在服務(wù)器中的Bean實例。
客戶做的第一件事是使用JNDI為所需要的Bean定位EJBHome。在本例子中, EJBHome對象可能以下列形式出現(xiàn):
public interface CartHome extends javax.ejb.EJBHome{
Cart create(String customerName , String account)
throws RemoteException, BadAccountException;
}
CartHome接口包含一個create()方法, 當(dāng)客戶請求一個新的Bean的時候該方法將被調(diào)用。請注意, 這個方法是在EJBObject中實現(xiàn)的并將在被調(diào)用時調(diào)用Bean類中的ejbCreate()方法。
ShoppingCart類的EJBHome對象可使用下列代碼來定位:
Context initialContext = new InitialContext();
CartHome cartHome = (CartHome) initialContext.lookup
("application/mall/shopping-carts");
在本例中, 調(diào)用InitialContext()以得到JNDI命名層次的根;lookup()方法被用來得到CartHome。 在此種情況下, 'applications/mall/shopping.carts'是JNDI到達(dá)你感興趣的CartHome的路徑。此時, cartHome持有了ShoppingCartEJB的EJBHome對象的引用。然而, 請注意客戶的JNDI的命名空間可能被設(shè)置為包括分布于網(wǎng)絡(luò)上的多種機(jī)器上的EJB容器; EJB容器的實際位置一般來說對客戶是透明的。
下例顯示了客戶是如何使用EJBHome對象并調(diào)用方法的:
ShoppingCart cart = cartHome.create("Emma","0507");
Cart.addItem(100);
Cart.addItem(251);
Cat.purchase();
在上述代碼中, create()方法創(chuàng)建了一個新的session Bean, 變量cart 包括了一個對遠(yuǎn)程EJB Object的引用, EJB Object允許你調(diào)用它的方法additem()和purchase()。cartHome中的create()方法將調(diào)用對應(yīng)的Bean中的ejbCreate()方法。
EJB的未來
EJB規(guī)范1.0是在1998年JavaOne大會期間發(fā)布的, 它為建立分布式商務(wù)對象系統(tǒng)提供了堅實的結(jié)構(gòu)體系基礎(chǔ), 它不應(yīng)該被認(rèn)為是這一研究主題的結(jié)束, 而應(yīng)該是進(jìn)一步完善這一體系結(jié)構(gòu)的開始。該規(guī)范的一些內(nèi)容還需改進(jìn), 特別是處理persistence對象的EJB模型。另外, 還應(yīng)考慮標(biāo)準(zhǔn)化開發(fā)工具和開發(fā)系統(tǒng)之間的協(xié)定,以為所有開發(fā)環(huán)境提供統(tǒng)一的調(diào)試界面。
將來, SunMicrosystem還將研究兼容性問題。有兩個領(lǐng)域涉及到兼容性問題, 一是"EJB兼容的"服務(wù)器到底是由什么組成的? 一個兼容性計劃有望在不久的將來出現(xiàn); 二是保證不同廠商的EJB服務(wù)器具有相互操作性。Sun正在就這些問題征求其合作伙伴的意見, 以決定如何發(fā)展。
結(jié)論
企業(yè)JavaBean技術(shù)為我們提供了一種開發(fā)、部署和管理分布式商務(wù)應(yīng)用程序的新途徑。它使開發(fā)人員編寫作為可重復(fù)使用的服務(wù)器組件的分布式商務(wù)應(yīng)用程序變得更簡單, 并且不必?fù)?dān)心系統(tǒng)級編程問題。企業(yè)JavaBean組件結(jié)構(gòu)代表了在簡化企業(yè)應(yīng)用程序的開發(fā)、部署和管理方面的一個巨大進(jìn)步。有關(guān)企業(yè)JavaBean技術(shù)的完整描述, 請訪問企業(yè)JavaBean的網(wǎng)。