EJB
EJB (Enterprise JavaBean)是J2EE的一部分,定義了一個用于開發(fā)基于組件的企業(yè)多重應用程序的標準。其特點包括網絡服務支持和核心開發(fā)工具(SDK)。EJB是一個封裝有某個應用程序之業(yè)務邏輯服務器端組件。EJB最早于1997年由IBM提出,旋即被太陽微系統(tǒng)采用并形成標準(EJB 1.0 和EJB 1.1)。其后在Java社區(qū)進程(Java Community Process)支持下陸續(xù)有一些JSR被制訂來定義新的EJB標準,分別是JSR 19 (EJB 2.0), JSR 153 (EJB 2.1) 以及最新的JSR 220 (EJB 3.0)。
EJB規(guī)范的目的在于為企業(yè)及應用開發(fā)人員實現(xiàn)后臺業(yè)務提供一個標準方式,從而解決一些此前總是在作業(yè)過程中總是重復發(fā)生的問題。EJB以一個標準方式自動處理了諸如數(shù)據持久化,事務集成,安全對策等不同應用的共有問題,使得軟件開發(fā)人員可以專注于程序的特定需求而不再飽受那些非業(yè)務元素的困擾。
EJB的特點[ ]
- 由一個 EJB 容器在運行時創(chuàng)建和管理 EJB
- 在部署 EJB 時定制其運行方式
- 由 EJB 容器和服務器來協(xié)調客戶端的訪問
- 可以部署到任何兼容的 EJB 容器中
- 客戶端對 EJB 的視圖是由 Bean 開發(fā)人員決定的
EJB 容器[ ]
- 管理 Bean 生命周期:將 EJB 服務器提供的服務傳遞給 Bean
- 生成代碼來實現(xiàn)對 Bean 的存取訪問
- 強制事務處理的限制
- 創(chuàng)建、初始化和回收 Bean
- 管理持久數(shù)據的存儲
- 對客戶端而言 EJB 容器是透明的
EJB 容器提供的服務[ ]
數(shù)據存儲
- 容器決定何時載入/儲存狀態(tài)
- Container-Managed Persistence(容器管理存儲/CMP)
- 容器負責存儲您的 Bean
- 容器生成必要的類和代碼
- Bean-Managed Persistence(Bean 管理存儲/BMP)
- Bean 開發(fā)人員提供存儲代碼
- 開發(fā)人員決定 如何存儲, 容器仍然決定 何時進行
事務處理
- 可以由容器代理來實現(xiàn)
- 容器將得到業(yè)務邏輯方法的事務處理需求
- 容器提供事務控制代碼
- 也可以由程序員通過代碼實現(xiàn)
其它服務
其它服務包括:
- 命名 (Naming)
- 安全 (Security)
- 線程管理 (Thread management)
- 這些服務由容器代理完成將減少應用開發(fā)人員的負擔
EJB的種類[ ]
EJB容器可以接受三類EJB
- 會話Bean(Session Beans)
- 1、無狀態(tài)會話Bean(Stateless Session Beans)
無狀態(tài)會話Bean是一類不包含狀態(tài)信息的分布式對象,允許來自數(shù)個客戶端的并發(fā)訪問。實例變量的內容在前后數(shù)次呼出中不被保留(確切地說是不保證保留)。由于不必控制與用戶間的對話信息而減少了開銷,無狀態(tài)會話Bean不像有狀態(tài)會話Bean那樣具有資源集約性。舉例來說,一個發(fā)送郵件的EJB就可被設計為一個無狀態(tài)會話Bean。在整個會話期,用戶只向服務器提交一個動作:發(fā)送指定郵件到指定地址。(稱為開關行為)
- 2、有狀態(tài)會話Bean(Stateful Session Beans)
有狀態(tài)會話Bean是包含狀態(tài)的分布式對象,即是說,貫穿整個會話它們都要保有客戶端信息。舉例而言,在一個網上商店進行實施結賬很可能就需要一個有狀態(tài)會話Bean,因為結賬是一個多步動作,服務器端必須可以隨時了解到用戶已經進行到了哪一步。此外,盡管有狀態(tài)會話Bean的狀態(tài)信息可被保持,但始終只能同是由一個用戶來訪問之。
- 實體Bean(Entity Beans)
實體Bean是含有持久化狀態(tài)的分布式對象。這個持久化狀態(tài)的管理既可以交給Bean自身(Bean-Managed Persistence,BMP),也可以托付于外部機制(Container-Managed Persistence,CMP)。
- 消息驅動Bean(Message Driven Beans ,MDBs)
消息驅動Bean是支持異步行為的分布式對象。它們并不對請求進行當即響應。比方說,某網站用戶點擊“請通知我更新信息”按鈕,將會觸發(fā)某個MDB將這名用戶加入到數(shù)據庫的希望獲得更新信息用戶列表中。這個動作就是一個異步的消息驅動過程,因為用戶不必等待當時會返回某個結果。MDB的消息源來自Java消息服務(JMS)提供的消息隊列或消息主題。自EJB 2.0規(guī)范起,JMS被加入進來以允許在容器內部實施事件驅動處理。與其他EJB不同,MDB不存在一個用戶視圖(如需要用戶引用的遠程接口),用戶也不能通過資源定位獲得一個MDB實例。MDB只在后臺監(jiān)聽消息源并實施自動處理。
除了上述以外,目前還有一些EJB處于設想階段,如JSR 86提出了用于在JavaEE應用中集成多媒體對象的媒體Bean(Enterprise Media Beans)。
EJB的體系結構[ ]
- 目前,EJB最新的標準是2.1,EJB3.0規(guī)范正在討論中,預計將于明年推出。EJB2.1定義了三種企業(yè)Bean,分別是會話Bean(Session Bean),實體Bean(Entity Bean)和消息驅動Bean(MessageDriven Bean)。
- Session Bean用于實現(xiàn)業(yè)務邏輯,它可以是有狀態(tài)的,也可以是無狀態(tài)的。每當客戶端請求時,容器就會選擇一個Session Bean來為客戶端服務。Session Bean可以直接訪問數(shù)據庫,但更多時候,它會通過Entity Bean實現(xiàn)數(shù)據訪問。
- Entity Bean是域模型對象,用于實現(xiàn)O/R映射,負責將數(shù)據庫中的表記錄映射為內存中的Entity對象,事實上,創(chuàng)建一個Entity Bean對象相當于新建一條記錄,刪除一個Entity Bean會同時從數(shù)據庫中刪除對應記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態(tài)和數(shù)據庫同步。
- MessageDriven Bean是EJB2.0中引入的新的企業(yè)Bean,它基于JMS消息,只能接收客戶端發(fā)送的JMS消息然后處理。MDB實際上是一個異步的無狀態(tài)Session Bean,客戶端調用MDB后無需等待,立刻返回,MDB將異步處理客戶請求。這適合于需要異步處理請求的場合,比如訂單處理,這樣就能避免客戶端長時間的等待一個方法調用直到返回結果。
- 調用一個EJB組件要比調用一個JavaBean麻煩些,由于EJB組件可以分布在多口,然后使用Home接口創(chuàng)建EJB之后就可以調用EJB的方法了。
EJB的理論實行[ ]
EJB部署于應用服務器端的EJB容器中。規(guī)范給定了EJB與EJB容器之間,以及用戶代碼與EJB/EJB容器之間的交互方式。對于Java EE API,javax.ejb包定義了EJB類,javax.ejb.spi包定義了EJB容器應當實現(xiàn)的各個接口。
在EJB 2.1和以前的版本中,每個EJB都由一個類和兩個接口組成。EJB容器負責創(chuàng)建這個類的實例,接口則供客戶端調用。
兩個接口分別被稱為Home接口和組件接口,負責提供各個EJB遠程方法聲明。這些EJB遠程方法可分成兩組:
- 類方法:由Home接口提供。與特定實例無關,僅負責一些公共內容,比如創(chuàng)建一個新的EJB實例(create方法),或尋找一個已經存在的EJB實例(find方法)等等。
- 接口方法:由組件接口提供的針對特定實例的業(yè)務方法。
EJB容器將為這些接口提供對應的實現(xiàn)類以充當客戶遠程代理,當客戶端調用這個生成的代理類的某個方法時,代理類內部會將此調用的方法和參數(shù)封裝成一個消息發(fā)送給服務器。服務器受到消息后在轉發(fā)給真實的EJB實例,后者負責執(zhí)行真正的業(yè)務邏輯。
遠程通信
EJB規(guī)范要求EJB容器能夠支持基于RMI-IIOP的EJB訪問。EJB既可被任何CORBA應用訪問,也能提供Web服務。
事務
EJB容器必須支持符合ACID(原子性/一致性/獨立性/持久性)特性的容器級事務管理,以及bean內部事務管理。容器級事務需在部署描述符中(EJB應用的配置文件)進行聲明。
事件
EJB使用JMS向客戶對象發(fā)送消息,客戶則可以異步地接受這些消息。MDB則接受來自客戶端的消息。
命名和目錄服務
EJB客戶端使用JNDI或CORBA名字服務定位Home接口實現(xiàn) 對象。通過此Home接口,用戶還可以尋找,創(chuàng)建或刪除實體對象。
安全
EJB容器對客戶端的訪問權限負責。
部署EJB
EJB規(guī)范還定義了一個跨平臺的統(tǒng)一部署機制。部署描述符中定義了關于EJB應用的一切相關內容。文件名通常為ejb-jar.xml。
部署描述符是一個XML文檔,負責為該EJB應用中的每一個EJB定義入口。部署描述符的主要內容包括:
- Home接口名
- Bean的Java類名
- Home接口的Java接口名
- 組件接口的Java接口名
- 持久化存儲(針對實體Bean)
- 安全策略和角色分配
通常EJB容器提供者還定義了一些額外的XML或其他格式描述文件來強化其容器的功能。他們還同時提供這些描述文件的解讀工具類和對Home接口的自動實現(xiàn)類生成。
EJB3.0起開始廣泛使用Java注釋替代傳統(tǒng)的部署描述符ejb-jar.xml。但后者仍然有效。
EJB版本歷史[ ]
EJB 3.0
2006年5月2日發(fā)布,JSR 220定義。
- 全面采用Java注釋代替部署描述符。(后者仍可使用,并且具有更高優(yōu)先級)
- 把2.X版的EntityBean改為由JPA支持。
EJB 2.1
2003年11月24日發(fā)布,JSR 153定義。
- Web服務:可將無狀態(tài)會話bean暴露為Web服務;EJB可通過引用訪問Web服務。
- EJB定時器服務:提供一種新的基于定時器的事件驅動方式??晒┫Ⅱ寗觔ean作為消息源使用。
- 增加了消息目的地。
- 進一步豐富了EJB查詢語言,支持ORDER BY, AVG, MIN, MAX, SUM, COUNT和MOD。
- 使用XML schema代替DTD以定義部署描述符。
EJB 2.0
2001年8月22日發(fā)布,JSR 19 定義。
- 制定了構建面向對象商務應用的標準組建結構。
- 支持構筑使用不同開發(fā)工具所開發(fā)之組件的聯(lián)合應用部署。
- 在多線程,連接池,事務管理等方面對用戶透明化。
- 使符合“一次寫成,多次運行”的Java思想。
- 關注企業(yè)級應用生命期間的開發(fā),部署,運行等動作。
- 定義了不同開發(fā)工具所需遵守的契約,以便其產品能夠在運行期交互。
- 支持與現(xiàn)行系統(tǒng)兼容,開發(fā)者可以擴展現(xiàn)有產品以使之支持EJB。
- 與其他Java API兼容。
- 支持EJB與Java2平臺企業(yè)版或者其他非Java應用程序之間的互操作性。
- 支持與CORBA兼容的RMI-IIOP。
EJB 1.1
1999年12月17日發(fā)布。
- 開始采用XML部署描述符,默認的JNDI上下文以及可支持IIOP的RMI。
- 安全機制由角色(Role)驅動,而非方法。
- 支持實體類,且必須在應用中實現(xiàn)。
EJB 1.0
1998年3月24日發(fā)布。
- 定義了EJB和EJB容器的作用,實現(xiàn)與互動。
- 提供了最早的開發(fā)者與用戶視圖。