EnterPRise javaBeans(EJB)是一個(gè)開發(fā)和部署分布式服務(wù)器端的、帶事務(wù)處理的、安全的商業(yè)組件的規(guī)范和結(jié)構(gòu)。EJB的體系結(jié)構(gòu)是J2EE的基礎(chǔ)和核心,J2EE定義了整個(gè)標(biāo)準(zhǔn)的應(yīng)用開發(fā)體系結(jié)構(gòu)和一個(gè)部署環(huán)境。
在這個(gè)體系結(jié)構(gòu)中,應(yīng)用開發(fā)者的注重力集中在封裝商業(yè)邏輯和商業(yè)規(guī)則上,一切與基礎(chǔ)結(jié)構(gòu)服務(wù)相關(guān)的問題和底層分配問題都由應(yīng)用程序容器或服務(wù)器來處理。
甚至,從屬于事務(wù)、持久化、安全等等方面的應(yīng)用組件的運(yùn)行時(shí)屬性都可以使用高度靈活的聲明方法在部署的環(huán)境中定制。這個(gè)體系結(jié)構(gòu)定義了一個(gè)容器和一個(gè)服務(wù)器模型--容器是應(yīng)用組件生存和執(zhí)行的環(huán)境,而這個(gè)容器卻又借居在一個(gè)服務(wù)器之中。
J2EE平臺(tái)提供了一個(gè)簡(jiǎn)化的開發(fā)模型,它具有工業(yè)強(qiáng)度的可擴(kuò)展性、支持合理的集成和靈活的部署,與開發(fā)商和應(yīng)用服務(wù)器無關(guān),這一切使得一些專用的應(yīng)用服務(wù)器和專用的分布式對(duì)象框架變得古舊了。
EJB的角色和責(zé)任
EJB規(guī)范定義了幾個(gè)標(biāo)準(zhǔn)的角色和責(zé)任者,如下:
1.EJB服務(wù)器提供商提供的應(yīng)用服務(wù)器應(yīng)是一個(gè)在分布式事務(wù)處理、系統(tǒng)服務(wù)等方面的專家。
2.EJB容器提供商提供EJB組件實(shí)例運(yùn)行環(huán)境和部署工具。
服務(wù)器/容器提供商是典型的操作系統(tǒng)開發(fā)商、數(shù)據(jù)庫開發(fā)商或者是應(yīng)用服務(wù)器開發(fā)商。EJB的服務(wù)器和EJB的容器應(yīng)是同一個(gè)開發(fā)商提供,因?yàn)闊o論是在現(xiàn)在的EJB1.1規(guī)范(最終版)還是EJB2.0公共草稿版(正在修改)中都沒有定義兩者之間的接口。
3.Bean的提供商或者EJB開發(fā)者開發(fā)的EJB組件都包涵商業(yè)邏輯及商業(yè)功能。EJB開發(fā)者提供的每一個(gè)EJB組件都應(yīng)滿足以下條件:EJB的實(shí)現(xiàn)中應(yīng)包括所有必須有的組件-容器合同方法(Contract method),如:ejbCreate(),ejbRemove()等等和一些商業(yè)方法(business method);Home接口;Remote接口;如需要還應(yīng)有幫助類。Home接口為創(chuàng)建、刪除和查找EJB實(shí)例的方法提供簽名,Remote接口定義了商業(yè)方法的簽名。
4.應(yīng)用程序組裝器把一些由Bean提供商開發(fā)的EJB組件組裝成一個(gè)完整的J2EE應(yīng)用程序。
5.部署器在應(yīng)用程序部署的目標(biāo)產(chǎn)品環(huán)境中是專家,它在應(yīng)用服務(wù)器中安裝應(yīng)用組件并配置它們的事務(wù)、持久化和安全方面。這樣你就可以治理復(fù)雜的問題了,諸如:事務(wù)處理、并發(fā)處理、持久化以及安全。
6.系統(tǒng)治理者負(fù)責(zé)服務(wù)器的配置和治理、運(yùn)行監(jiān)控和負(fù)載平衡。
7.應(yīng)用程序的用戶界面開發(fā)者負(fù)責(zé)用戶界面和表示邏輯。
這篇文章的焦點(diǎn)集中在Bean提供商/EJB開發(fā)者方面和EJB組件實(shí)現(xiàn)代碼的限制方面。
EJB組件的約束
EJB的開發(fā)者并不需要在EJB的組件實(shí)現(xiàn)代碼中編寫系統(tǒng)級(jí)的服務(wù),EJB提供商/開發(fā)者需知道并且嚴(yán)格地遵守一些限制,這些限制與開發(fā)穩(wěn)定的和可移植的EJB組件的利益有關(guān)。以下是你應(yīng)該回避使用的一些Java特色,并且在你的EJB組件的實(shí)現(xiàn)代碼中要嚴(yán)格限制它們的使用:
1.使用static,非final 字段。建議你在EJB組件中把所有的static字段都聲明為final型的。這樣可以保證前后一致的運(yùn)行期語義,使得EJB容器有可以在多個(gè)Java虛擬機(jī)之間分發(fā)組件實(shí)例的靈活性。
2.使用線程同步原語來同步多個(gè)組件實(shí)例的運(yùn)行。避免這個(gè)問題,你就可以使EJB容器靈活的在多個(gè)Java虛擬機(jī)之間分發(fā)組件實(shí)例。
3.使用AWT函數(shù)完成鍵盤的輸入和顯示輸出。約束它的原因是服務(wù)器方的商業(yè)組件意味著提供商業(yè)功能而不包括用戶界面和鍵盤的I/O功能。 4.使用文件訪問/java.io 操作。EJB商業(yè)組件意味著使用資源治理器如JDBC來存儲(chǔ)和檢索數(shù)據(jù)而不是使用文件系統(tǒng)API。同時(shí),部署工具提供了在部署描述器(descriptor)中存儲(chǔ)環(huán)境實(shí)體,以至于EJB組件可以通過環(huán)境命名上下文用一種標(biāo)準(zhǔn)的方法進(jìn)行環(huán)境實(shí)體查詢。所以,使用文件系統(tǒng)的需求基本上是被排除了。
5.監(jiān)聽和接收socket連接,或者用socket進(jìn)行多路發(fā)送。EJB組件并不意味著提供網(wǎng)絡(luò)socket服務(wù)器功能,但是,這個(gè)體系結(jié)構(gòu)使得EJB組件可以作為socket客戶或是RMI客戶并且可以和容器所治理的環(huán)境外面的代碼進(jìn)行通訊。
6.使用映象API查詢EJB組件由于安全規(guī)則所不能訪問的類。這個(gè)約束加強(qiáng)了Java32 平臺(tái)的安全性。
7.欲創(chuàng)建或獲得一個(gè)類的加載器,設(shè)置或創(chuàng)建一個(gè)新的安全治理器,停止Java虛擬機(jī),改變輸入、輸出和出錯(cuò)流。這個(gè)約束加強(qiáng)了安全性同時(shí)保留了EJB容器治理運(yùn)行環(huán)境的能力。
8.設(shè)置socket工廠被URL's ServerSocket,Socket和Stream handler使用。避免這個(gè)特點(diǎn),可以加強(qiáng)安全性同時(shí)保留了EJB容器治理運(yùn)行環(huán)境的能力。
9.使用任何方法啟動(dòng)、停止和治理線程。這個(gè)約束消除了與EJB容器治理死鎖、線程和并發(fā)問題的責(zé)任相沖突的可能性。
通過限制使用10-16幾個(gè)特點(diǎn),你的目標(biāo)是堵上一個(gè)潛在的安全漏洞: 10.直接讀寫文件描述符。
11.為一段特定的代碼獲得安全策略信息。
12.加載原始的類庫。
13.訪問Java一般角色所不能訪問的包和類。
14.在包中定義一個(gè)類。
15.訪問或修改安全配置對(duì)象(策略、安全、提供者、簽名者和實(shí)體)。
16.使用Java序列化特點(diǎn)中的細(xì)分類和對(duì)象替代。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注