<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    love fish大鵬一曰同風(fēng)起,扶搖直上九萬(wàn)里

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    friends

    link

    最新評(píng)論

    使用EJB3.O簡(jiǎn)化EJB開發(fā)(全中文)(轉(zhuǎn))

    使用EJB3.O簡(jiǎn)化EJB開發(fā)??? 原著:Debu Panda

    我們引入EJB來(lái)構(gòu)造分布式的組件。它誕生之時(shí)是為了解決所有CORBA的問(wèn)題和復(fù)雜性。經(jīng)歷過(guò)幾次重要的版本更新和增加許多特性之后,EJB已經(jīng)成為了J2EE的核心。在早期,很多開發(fā)人員沉迷于EJB甚至在沒(méi)有任何意義的情況下在他們的工程中使用EJB。而當(dāng)他們發(fā)現(xiàn)所使用的工程并沒(méi)有質(zhì)的變化后,譴責(zé)EJB成了一種趨勢(shì)。

    開發(fā)EJB從來(lái)沒(méi)有變得簡(jiǎn)單甚至在早期的EJB版本規(guī)范中變得更加復(fù)雜。EJB由于其的復(fù)雜性和重量級(jí)特性而被比作一只大象。學(xué)多開發(fā)人員感覺EJB象一個(gè)油炸圈餅上多余的一層甜糖漿。在現(xiàn)在low carb和Atkins diet大行其道的今天,EJB專家委員會(huì)也沒(méi)有選擇余地的發(fā)布了體現(xiàn)low carb的EJB規(guī)范來(lái)簡(jiǎn)化EJB的開發(fā)。EJB3.0專家委員會(huì)在2004Javaone大會(huì)上發(fā)布了稱之為EJB3.0第一個(gè)公開規(guī)范的輕量級(jí)模型的范例圖。

    第一眼看到EJB的新模型感覺很不錯(cuò)。在這篇文章中我們將討論EJB3.0如何使用一個(gè)更小而精致的裝配來(lái)吸引開發(fā)者的。在接下來(lái)的文章中我們將來(lái)討論EJB3.0是怎樣簡(jiǎn)化持久性模型的。

    整理缺陷

    在我們開始對(duì)EJB3.0帶來(lái)的新特性進(jìn)行討論之前,讓我們先分析一下現(xiàn)在EJB模型的復(fù)雜繁瑣。

    • 現(xiàn)在的EJB模型需要建立許多組件接口和實(shí)現(xiàn)許多不必要的回滾方法。
    • 組件接口需要實(shí)現(xiàn) EJBObject 或者 EJBLocalObject ,并且處理許多不必要的異常。
    • EJB的部署描述復(fù)雜而容易出錯(cuò)。
    • 基于EJB模型的容器持久化管理的開發(fā)和管理過(guò)于復(fù)雜。許多基礎(chǔ)的特征未考慮到,比如使用數(shù)據(jù)庫(kù)序列和EJBQL定義一個(gè)主鍵的標(biāo)準(zhǔn)方法就非常有限。
    • EJB組件不像是面向?qū)ο蟮?,比如在使用繼承和多態(tài)時(shí)就有太多限制。
    • 一個(gè)主要的EJB的缺點(diǎn)是你不能脫離EJB容器測(cè)試一個(gè)EJB模型且不能在容器內(nèi)調(diào)試一個(gè)EJB,這對(duì)開發(fā)者無(wú)疑是一個(gè)可怕的事情。
    如果你使用EJB你需要熟悉調(diào)用和查找EJB的復(fù)雜過(guò)程。顯然,你僅僅要在程序中使用EJB但你卻必須知道JNDI詳細(xì)的細(xì)節(jié)。

    簡(jiǎn)化開發(fā)者的觀點(diǎn)

    如果你使用現(xiàn)有版本的EJB你會(huì)懂得開發(fā)一個(gè)如HelloWorld的簡(jiǎn)單的EJB程序是多么困難。你至少需要兩個(gè)接口,一個(gè)bean類和一個(gè)部署描述文件。大多數(shù)的開發(fā)者希望知道為什么我需要所有這些。IDEs(開發(fā)環(huán)境工具)象OracleJDeveloper, EclipseXDoclet簡(jiǎn)化了開發(fā)者的做這些普通的工作開發(fā)周期,可是在EJB在你部署到所選擇的容器中之前,編譯類和打包部署文件依然是開發(fā)人員的工作。

    EJB3.0試圖從以下方面簡(jiǎn)化復(fù)雜性:

    ·???????? 不必定義接口和部署的描述文件,這些可以由容器使用metadata annotations生成。

    ·???????? 使用常用的Java類作為EJB的類和常用的EJB業(yè)務(wù)接口。

    元數(shù)據(jù)描述(Metadata Annotations)

    EJB3.0非常倚重Metadata Annotations。Metadata Annotations已經(jīng)成為JSR 175標(biāo)準(zhǔn)并且將是J2SE 5.0的一部分。Annotations是一種對(duì)象變成的屬性,非常類似與XDoclet??墒遣幌馲Doclet那樣需要預(yù)先編譯,Annotations由Java編譯器在需要編譯的時(shí)候編譯。(依賴于@Retention的開始時(shí)間)。在開發(fā)人員的觀點(diǎn),Annotations就如同一個(gè)公有的并可以作為類,域,方法,參數(shù),本地變量,構(gòu)造,枚舉和包一樣使用的修改量。你可以在你的Java代碼中附帶特殊的屬性使用Annotations來(lái)生成代碼,自動(dòng)編寫文檔代碼,或者提供如在運(yùn)行期間增強(qiáng)業(yè)務(wù)層安全或特殊業(yè)務(wù)邏輯的特殊服務(wù)。J2EE1.5(5.0)的目標(biāo)是簡(jiǎn)化開發(fā)人員使用Annotations因此而可能產(chǎn)生一套的Annotations模板。Annotations使用@來(lái)標(biāo)記,如下:

    ? @Author("Debu Panda")

    ? @Bean

    ? public class MySessionBean

    EJB3.0為了簡(jiǎn)化開發(fā)因此使用Metadata Annotations來(lái)產(chǎn)生許多如接口一樣的人為因素和使用Annotations來(lái)替代部署描述文件。

    使用 POJOs 和 POJIs

    在規(guī)范條件中,JavaBeans和接口經(jīng)常分別的涉及到簡(jiǎn)單Java對(duì)象(POJOs)和簡(jiǎn)單Java接口(POJIs)。這些不必要的如Home接口的人為因素已經(jīng)被去掉。

    開發(fā)人員必須在javax.ejb包中實(shí)現(xiàn)一個(gè)EJB接口(會(huì)話bean,實(shí)體bean或消息驅(qū)動(dòng)bean)或者選擇在bean的實(shí)現(xiàn)類中使用Annotation。你可以使用無(wú)狀態(tài),狀態(tài),消息驅(qū)動(dòng)或者實(shí)體去注釋一個(gè)bean類。例如,如果你定義一個(gè)無(wú)狀態(tài)EJB作為HelloWorld,你可以如下定義EJB:

    @Remote

    ? @Stateless public class HelloWorldBean {

    ?public String sayHello(String s)

    ? { System.out.println("Hello: "+s; }

    ? }

    EJB的接口無(wú)論遠(yuǎn)程的還是本地的都不必再實(shí)現(xiàn)EJBObjectEJBLocalObject。你要么為EJB提供業(yè)務(wù)接口并且實(shí)現(xiàn)bean類中的接口,要么需要在部署的時(shí)候生成這些接口。雖然會(huì)話bean和消息驅(qū)動(dòng)bean的接口是必須的,但是實(shí)體bean的接口是可選的。如果你沒(méi)有為你的會(huì)話bean實(shí)現(xiàn)一個(gè)接口,那么它會(huì)自動(dòng)為你生成一個(gè)。所生成的接口是本地的還是遠(yuǎn)程的取決于你在bean類中的Annotations。如果你仔細(xì)看看上面的代碼范例,@Remote很明顯是用來(lái)為你的HelloWorld生成一個(gè)遠(yuǎn)程接口。如果需要,你可以在你的EJB中同時(shí)生成遠(yuǎn)程和本地接口。

    在上面的例子中,很明顯開發(fā)人員不必再做那些如定義接口和實(shí)現(xiàn)回滾方法等這些普通的工作。

    生成接口的名字來(lái)源于bean實(shí)現(xiàn)類的名字。生成接口對(duì)開發(fā)人員來(lái)說(shuō)非常有用。但是我并沒(méi)有看到任何如Oracle 的JDeveloper的這些IDE立即實(shí)現(xiàn)這種生成接口功能。

    規(guī)范中沒(méi)有明確EJB查找時(shí)客戶端的需求是什么,也沒(méi)有明確我們?nèi)绾伪3诌@些EJB需要調(diào)用的接口。基于以下幾個(gè)情況下的原因我將不推薦使用生成接口:

    ·???????? 生成接口的名字來(lái)源于bean的名字

    ·???????? 如果你不愿意在EJB中暴露出一些方法而生成接口將默認(rèn)暴露出所有的方法。

    ·???????? 你需要在客戶端使用接口來(lái)調(diào)用EJB.

    去掉回滾方法的需求。

    EJB2.1和更早版本需要實(shí)現(xiàn)很多即使對(duì)于每個(gè)EJB你不需要的一些生命周期的方法,如ejbPassivate, ejbActivate, ejbLoad, ejbStore等等。例如,在無(wú)狀態(tài)會(huì)話bean中不需要ejbPassivate但是你還是得實(shí)現(xiàn)它的方法?,F(xiàn)在EJB3.0中類似的常用Java類實(shí)現(xiàn)這些生命周期的方法都變成為可選擇的。如果你在EJB中實(shí)現(xiàn)任何回滾容器都會(huì)調(diào)用這些方法。

    唯一的異常是在你可以使用Removeannotations時(shí)一個(gè)狀態(tài)會(huì)話bean的業(yè)務(wù)方法的ejbRemove方法是狀態(tài)會(huì)話bean。如果你使用這個(gè)annotations它將在完成annotations方法后(無(wú)論正常或非正常)提示容器移除狀態(tài)會(huì)話bean實(shí)例。例如,你可以指定以下的方式去在checkOut方法執(zhí)行后移除一個(gè)狀態(tài)會(huì)話bean實(shí)例。

    @Stateful public class Cart {

    ...

    ...

    @Remove public void checkOut() {

    ...

    }

    }

    Annotations與部署描述的比較

    在前面我們討論到EJB中不再需要部署描述而由annotations代替。每個(gè)部署描述的屬性都將被選擇一個(gè)默認(rèn)值,而開發(fā)人員在直到他們想改變這些屬性的默認(rèn)值之前不必為這些屬性指定值。這些也能用來(lái)為bean的類自身指定使用的annotations。EJB3.0規(guī)范為開發(fā)人員使用bean類型,接口類型,資源引用,事務(wù)屬性,安全等等定義了一組metadata annotations。例如,如果我們可以如下為一個(gè)特殊的EJB定義使用資源引用:

    @Resource(name="jdbc/OracleDS", resourceType="javax.sql.DataSource")

    J2EE的提供商如Oracle, BEA, IBM將增加屬性annotations在他們指定的部署描述中,開發(fā)人員將可以使用這些annotations去避免使用部署描述。這看起來(lái)對(duì)開發(fā)人員十分具有吸引力,特別對(duì)XML描述是已經(jīng)感到厭惡的開發(fā)人員,他們?cè)缇秃尥覆⑾朊撾x老的那種描述方式,但依然有一些問(wèn)題使得我們?cè)谡绞褂胊nnotations時(shí)需要謹(jǐn)慎對(duì)待。

    • 它違背了我們輕便應(yīng)用程序的目標(biāo),因?yàn)槿绻粋€(gè)EJB如果使用一個(gè)提供商指定的部署描述,在重新編譯或打包EJB的時(shí)候它必須多次改變。
    • 部署描述對(duì)EJB模板提供了全局觀點(diǎn)使得組裝和部署的時(shí)候不必考慮單獨(dú)的EJB,他們將每個(gè)部署需求擰在一起,并且在部署完成之前描述是無(wú)效或者不可自動(dòng)生成的。這對(duì)部署員來(lái)說(shuō)是個(gè)可怕的事情。
    • 部署描述在EJB模板中被相關(guān)工具用來(lái)定義EJBs,當(dāng)你試圖整合一個(gè)和另一個(gè)容器的時(shí)候非常有用。EJB3.0規(guī)格同樣主張?jiān)诓渴鹈枋鲋惺褂弥剌dannotations的方式??墒窃谝?guī)范里并沒(méi)有提到重載annotations的細(xì)節(jié)。

    無(wú)疑擺脫部署描述將使得新的開發(fā)者開發(fā)更加容易,但是如果使用不當(dāng)這也將造成管理上的可怕問(wèn)題。

    簡(jiǎn)化持久化容器管理

    CMP實(shí)體bean將成為EJB3.0使得開發(fā)人員強(qiáng)制使用的一個(gè)主要的檢查方式。持久化框架象如OracleAS TopLink, 開源的Hibernate已經(jīng)成為不像實(shí)體bean本質(zhì)上的復(fù)雜和重量級(jí)的開發(fā)J2EE持久化框架應(yīng)用的被大家喜愛的方式。 EJB3.0采納了如TopLinkHibernate輕量級(jí)的持久化模式來(lái)簡(jiǎn)化容器持久化管理,這些聽起來(lái)更讓開發(fā)人員們欣喜。讓我們簡(jiǎn)單的瀏覽一下實(shí)體bean的計(jì)劃,我們將在另外的文章中討論持久化改進(jìn)的細(xì)節(jié)。

    實(shí)體bean作為POJOs已經(jīng)改頭換面,實(shí)體bean將不在需要組件接口。實(shí)體bean現(xiàn)在看起來(lái)是支持繼承和多態(tài)的純粹的對(duì)象。

    下面的是關(guān)于實(shí)體bean源代碼

    @Entity public class Employee{

    ? private Long empNo;

    ? private String empName;

    ? private Address address;

    ? private Hashmap projects = new Hashmap();

    ? private Double salary;

    ? @Id(generate=SEQUENCE) public Long getEmpNo() {

    ? return empNo;

    ? }

    ? protected void setEmpNo(Long empNo) {

    ? this.empNo = empNo;

    ? }

    ? public String getEmpName() {

    ? return EmpName;

    ? }

    ? public void setEmpName(String EmpName){

    ? this.EmpName = EmpName;

    ? }

    ? @Dependent public Address getAddress() {

    ? return address;

    ? }

    ? public void setAddress(Address address) {

    ? this.address = address;

    ? }

    ? public Set getProjects() {

    ? return projects;

    ? }

    ? public void setProjects(Set projects) {

    ? this.projects = projects;

    ? }

    ? public Double getSalary() {

    ? return salary;

    ? }

    ? public void setSalary(Double salary) {

    ? this.salary = salary;

    ? }

    ? ....

    ? }

    如果你仔細(xì)看這些代碼,你可以發(fā)現(xiàn)在現(xiàn)在的實(shí)體beanbean類是一個(gè)具體的類而不再是一個(gè)抽象類。

    EJB QL和實(shí)體beanSQL查詢做了多項(xiàng)改進(jìn)。類似于Hibernate的新的實(shí)體管理API和簡(jiǎn)化版的TopLink的會(huì)話API被建議用來(lái)處理實(shí)體bean的操作,也就是實(shí)體bean的創(chuàng)建,釋放,查找。

    我們將在深入的文章中進(jìn)一步對(duì)建議CMP實(shí)體bean的細(xì)節(jié)做更多的驗(yàn)證。

    簡(jiǎn)化EJB客戶端

    即使應(yīng)用中EJB是序列化的,使用EJB也就是尋找和調(diào)用也是非常復(fù)雜的。J2EE 1.4 EJB 3.0規(guī)范致力于簡(jiǎn)化EJB客戶端。

    如果目前你希望使用EJB你必須在部署描述中定義EJB引用或者EJB本地引用,尋找到EJB然后調(diào)用。如果我們希望調(diào)用HelloWorld EJB,你可以按照下面的簡(jiǎn)單方法調(diào)用EJB使用已存在的實(shí)現(xiàn)。

    如下在部署描述中找到EJB指示的定義

    <ejb-ref>

    ? <ejb-ref-name>HelloWorldEJB</ejb-ref-name>

    ? <ejb-ref-type>Session</ejb-ref-type>

    ? <home>hello.HelloWorldHome</home>

    ? <remote> hello.HelloWorld</remote>

    ? </ejb-ref>

    然后按照如下方法尋找EJB.你需要明確處理EJB查找和建立一個(gè)bean實(shí)例時(shí)的異常。

    try

    ? {

    ??? Context context = new InitialContext();

    ?????????????? HelloWorldHome helloHome =

    ?????????????? ? (HelloWorld)PortableRemoteObject.narrow(context.lookup

    ???? ("java:comp/env/ejb/HelloWorldEJB"), HelloWorldHome.class);

    ?????????????? HelloWorld hello = helloHome.create();

    ?????????????? ? ....

    ?? }

    ??? catch(RemoteException e)

    ?????????????? {

    ?????????????? ? System.err.println("System/communication error: " + e.getMessage());

    ?????????????? }

    ?????????????? catch(NamingException e)

    ?????????????? {

    ?????????????? ? System.err.println("Communication error: " + e.getMessage());

    ?????????????? }

    ?????????????? catch(CreateException e)

    ?????????????? {

    ?????????????? ? System.err.println("Error creating EJB instance: " + e.getMessage());

    ?????????????? }

    如一個(gè)環(huán)境變量的變化一樣,EJB3.0建議使用安放injection的方法查找和調(diào)用EJB.

    下面我們使用安放injection的方法在另一個(gè)EJB查找HelloWorldEJB

    @Inject private void setSessionContext(SessionContext ctx)

    ? {

    ? this.ctx = ctx

    ? }

    ? ...

    ? myHello = (HelloWorld)ctx.lookup("java:comp/env/ejb/HelloWorldEJB");

    如果你仔細(xì)查看上面的代碼,它依賴的injection使用@Injectset來(lái)的指定對(duì)SessionContext方法的annotations。injection 方法將可以在業(yè)務(wù)方法被EJB調(diào)用前被容器調(diào)用來(lái)設(shè)定EJBContext

    另一個(gè)injected HelloWorld會(huì)話bean的直接的范例可以簡(jiǎn)化為使用

    @EJB public HelloWorld myHello,這將使得myHelloHelloWorld bean的實(shí)例injected 。

    你可以使用依賴的injection來(lái)查詢?nèi)魏晤愋偷沫h(huán)境和資源參考如DataSource, JMS, Mail, Web Service等等。

    容器外部測(cè)試可行性

    一個(gè)現(xiàn)在EJB開發(fā)者所關(guān)注的不僅僅是EJB開發(fā)的復(fù)雜,也包括了測(cè)試的可怕之處。開發(fā)和測(cè)試EJB必須需要一個(gè)EJB容器并且開發(fā)人員必須熟悉最終部署平臺(tái)才可以執(zhí)行測(cè)試。這對(duì)于許多只在一個(gè)主要平臺(tái)開發(fā)的企業(yè)開發(fā)人員來(lái)說(shuō)不是主要問(wèn)題,但是對(duì)于支持多個(gè)開發(fā)商平臺(tái)并且要在維護(hù)的多個(gè)環(huán)境中測(cè)試EJBISV們來(lái)說(shuō)是個(gè)大問(wèn)題。EJB3.0規(guī)范承諾將提供在容器外測(cè)試的功能,但是這點(diǎn)在這次的規(guī)范中遺漏掉了。

    結(jié)論

    雖然還有很多關(guān)于打包,裝配和重要的API細(xì)節(jié)沒(méi)有在這個(gè)規(guī)范中提及,但是諸多的建議使得EJB3.0規(guī)范讓企業(yè)級(jí)Java開發(fā)人員看起來(lái)是恨有前途的。通過(guò)這些無(wú)疑是從開發(fā)人員到服務(wù)供應(yīng)商都將幫助減少開發(fā)的復(fù)雜性。下面就要看服務(wù)提供商們?cè)趺磳?shí)現(xiàn),并使得EJB3.0成為企業(yè)級(jí)應(yīng)用一個(gè)引人矚目的選擇。

    Author Bio 作者自述

    Debu PandaOracle應(yīng)用服務(wù)開發(fā)小組的主要管理者,他的在EJB容器和事務(wù)管理上取得過(guò)很多成就。他已經(jīng)有13年的IT產(chǎn)業(yè)的經(jīng)驗(yàn)并在多家雜志和技術(shù)出版社刊登過(guò)很多著作。

    ?

    翻譯問(wèn)題:

    由于部分英文名詞未敢枉自翻譯,所以留英文原詞在文中

    Cleaning up the Dirty Laundry?????? 整理缺陷

    low carb

    Atkins diet

    metadata annotations???? ?????????????? 元數(shù)據(jù)描述

    Simplifying Client View for EJBs?? 簡(jiǎn)化EJB客戶端

    dependency injection???????? ?????????? 依賴型injection

    setter injection????????????? ?????????????? 安放injection

    ISV Independent software vendor 獨(dú)立軟件供應(yīng)商

    posted on 2006-06-30 11:49 liaojiyong 閱讀(506) 評(píng)論(0)  編輯  收藏 所屬分類: EJB

    主站蜘蛛池模板: 亚洲电影一区二区| 九九全国免费视频| 久久99热精品免费观看牛牛| 美女被免费视频网站a国产| 国产亚洲成av片在线观看| 亚洲成AV人片高潮喷水| 1000部禁片黄的免费看| 亚洲中文字幕无码永久在线| 亚洲欧美日韩中文字幕在线一区| 久久精品无码专区免费东京热| 国产福利电影一区二区三区,亚洲国模精品一区| 亚洲六月丁香六月婷婷色伊人| 精品在线免费观看| 亚洲精品一级无码鲁丝片| 亚洲区日韩精品中文字幕| 最新黄色免费网站| 亚洲国产精品无码一线岛国| 欧亚一级毛片免费看| 成人免费福利电影| 亚洲人成网网址在线看| 精品免费tv久久久久久久| 国产AV无码专区亚洲AWWW | 国产一区二区免费视频| 无码欧精品亚洲日韩一区夜夜嗨| 久久精品国产亚洲AV久| 24小时在线免费视频| 亚洲av伊人久久综合密臀性色| 国产成人无码免费网站| 亚洲国产精品毛片av不卡在线| 亚洲成AV人影片在线观看| 最近的免费中文字幕视频| 亚洲国产成人无码av在线播放| 久久久国产精品无码免费专区| 亚洲中文字幕无码久久2017| 无遮挡呻吟娇喘视频免费播放| 国产精品嫩草影院免费| 亚洲国产高清国产拍精品| 天天看片天天爽_免费播放| 国产成人亚洲综合网站不卡| 国产无人区码卡二卡三卡免费| 亚洲天堂一区二区三区|