国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

EJB3.0新規(guī)范概覽及其未來發(fā)展

2024-07-21 02:14:47
字體:
供稿:網(wǎng)友
  • 本文來源于網(wǎng)頁設(shè)計愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。
  •   引言

      期待已久的ejb3.0規(guī)范在最近發(fā)布了它的初稿。在本文中將對新的規(guī)范進行一個概要性的介紹,包括新增的元數(shù)據(jù)支持,ejbql的修改,實體bean模型訪問bean上下文的新方法和運行時環(huán)境等等。作者還討論了ejb在未來要作出的調(diào)整以及ejb3.0與其他開發(fā)規(guī)范之間的關(guān)系。

      開始

      無論如何由于ejb的復(fù)雜性使之在j2ee架構(gòu)中的表現(xiàn)一直不是很好。ejb大概是j2ee架構(gòu)中唯一一個沒有兌現(xiàn)其能夠簡單開發(fā)并提高生產(chǎn)力的組建。 ejb3.0規(guī)范正嘗試在這方面作出努力以減輕其開發(fā)的復(fù)雜性。ejb3.0減輕了開發(fā)人員進行底層開發(fā)的工作量,它取消或最小化了很多(以前這些是必須實現(xiàn))回調(diào)方法的實現(xiàn),并且降低了實體bean及o/r映射模型的復(fù)雜性。

      在本文中,我首先會介紹ejb3.0中幾個主要的改變。它對進一步深入了解ejb3.0是非常重要的。隨后,我會從更高的層面來描述已經(jīng)被提交到ejb3.0規(guī)范中的細節(jié),并一個個的講解新的規(guī)范中的改變:實體 bean,o/r映射模型,實體關(guān)系模型和ejb ql(ejb查詢語言)等等。

      背景

      ejb3.0中兩個重要的變更分別是:使用了java5中的程序注釋工具和基于hibernate的o/r映射模型。

      java5中的元數(shù)據(jù)工具。

      java5 (以前叫j2se1.5或tiger)中加入了一種新的程序注釋工具。通過這個工具你可以自定義注釋標記,通過這些自定義標記來注釋字段、方法、類等等。這些注釋并不會影響程序的語義,但是可以通過工具(編譯時或運行時)來解釋這些標記并產(chǎn)生附加的內(nèi)容(比如部署描述文件),或者強制某些必須的運行時行為(比如ejb組件的狀態(tài)特性)。注釋的解析可以通過源文件的解析(比如編譯器或這ide工具)或者使用java5中的apis反射機制。注釋只能被定義在源代碼層。由于所有被提交到ejb3.0草案中的注釋標記都有一個運行時的retentionpolicy,因此會增加類文件占用的存儲空間,但這卻給容器制造商和工具制造商帶來了方便。

      hibernate

      目前hibernate非常受歡迎,它是開發(fā)源代碼的java o/r映射框架,目的是把開發(fā)人員從繁瑣的數(shù)據(jù)持久化編程中解脫出來。它也有一個標準的hql(hibernate 查詢語言)語言,你可以在新的ejb ql中看到它的影子。hibernate在處理如數(shù)據(jù)查詢、更新、連接池、事務(wù)處理、實體關(guān)系處理等方面非常簡單。

      概覽

      在已經(jīng)提交的ejb3.0規(guī)范中主要涉及兩個方面的改變:

      1. 一套以注釋為基礎(chǔ)的ejb編程模型,再加上ejb2.1中定義的通過部署描述符和幾個接口定義的應(yīng)用程序行為。

      2. 新的實體bean持久化模型,ejbql也有許多重要的改變。

      還有一些有關(guān)上述的提議,比如:一個新的客戶端編程模型,業(yè)務(wù)接口的使用以及實體bean的生命周期。請注意ejb2.1編程模型(包括部署描述符和home/remote接口)仍然是有效的。新的簡化模型并沒有完全取代ejb2.1模型。

      ejb注釋

      ejb 規(guī)范組織一個重要的目標是減輕原始代碼的數(shù)量,并且他們?yōu)榇私o出了一個完美而簡介的辦法。在ejb3.0的里,任何類型的企業(yè)級bean只是一個加了適當注釋的簡單java對象(pojo)。注釋可以用于定義bean的業(yè)務(wù)接口、o/r映射信息、資源引用信息,效果與在ejb2.1中定義部署描述符和接口是一樣的。在ejb3.0中部署描述符不再是必須的了;home接口也沒有了,你也不必實現(xiàn)業(yè)務(wù)接口(容器可以為你完成這些事情)。

      比如,你可以使用@stateless注釋標記類把java類聲明為一個無狀態(tài)回話bean。對于有狀態(tài)回話bean來說,@remove注釋可以用來標記一個特定的方法,通過這個注釋來說明在調(diào)用這個方法之后bean的實例將被清除掉。

      為了減少描述組件的說明信息,規(guī)范組織還采納了由異常進行配置(configuration-by-exception)的手段,意思是你可以為所有的注釋提供一個明確的缺省值,這樣多數(shù)常規(guī)信息就可以據(jù)此推斷得出。

      新的持久化模型

      新的實體bean也是一個加了注釋的簡單java對象(pojo)。一旦它被entitymanager訪問它就成為了一個持久化對象,并且成為了持久化上下文(context)的一部分。一個持久化上下文與一個事務(wù)上下文是松耦合的;嚴格的講,它隱含的與一個事務(wù)會話共存。

      實體關(guān)系也是通過注釋來定義的,o/r映射也是,并提供幾種不同的數(shù)據(jù)庫規(guī)范操作,在ejb2.1中這些要通過開發(fā)人員自己的設(shè)計模式或者其它技術(shù)來完成的(比如,自增長主鍵策略)。

      深入研究

      現(xiàn)在是時候詳細了解ejb3.0草案了。讓我們開始探討所有ejb中四種企業(yè)級bean,并看看他們在新的規(guī)范中是什么樣子。

      無狀態(tài)回話bean

      在ejb3.0規(guī)范中,寫一個無狀態(tài)回話bean(slsb)只需要一個簡單的java文件并在類層加上@stateless注釋就可以了。這個bean可以擴展javax.ejb.sessionbean接口,但這些不是必須的。

      一個slsb不再需要home接口,沒有哪類ejb再需要它了。bean類可以實現(xiàn)業(yè)務(wù)接口也可以不實現(xiàn)它。如果沒有實現(xiàn)任何業(yè)務(wù)接口,業(yè)務(wù)接口會由任意 public的方法產(chǎn)生。如果只有幾個業(yè)務(wù)方法會被暴露在業(yè)務(wù)接口中,這些方法可以使用@businessmethod注釋。缺省情況下所有產(chǎn)生的接口都是local(本地)接口,你也可以使用@remote注釋來聲明這個接口為remote(遠程)接口。

      下面的幾行代碼就可以定義一個helloworldbean了。而在ejb2.1中同樣的bean至少需要兩個接口,一個實現(xiàn)類和幾個空的實現(xiàn)方法,再加上部署描述符。

    import javax.ejb.*;

    /**
    * a stateless session bean requesting that a remote business
    * interface be generated for it.
    */
    @stateless
    @remote
    public class helloworldbean {
    public string sayhello() {
    return "hello world!!!";
    }
    }


      有狀態(tài)回話bean

      除了幾個sfsb的特別說明之外,有狀態(tài)回話bean(sfsb)和slsb一樣精簡:

      ·一個sfsb應(yīng)該有一個方法來初始化自己(在ejb2.1中是通過ejbcreate()來實現(xiàn)的)。在ejb3.0的規(guī)范中建議這些初始化操作可以通過自定義方法完成,并把他們暴露在業(yè)務(wù)接口中。在使用這個bean之前由客戶端來調(diào)用相應(yīng)的初始化方法。目前規(guī)范組織就是否提供一個注釋來標記某個方法用于初始化還存在爭議。

      ·bean的提供者可以用@remove注釋來標記任何sfsb的方法,以說明這個方法被調(diào)用之后bean的實例將被移除。同樣,規(guī)范組織仍然在討論是否要有一種機制來處理這種特殊的情況,即當這個方法出現(xiàn)異常的情況下bean的實例是否被移除。

      下面是對以上問題我個人的觀點:

      ·是否應(yīng)該有一個注釋來標明一個方法進行初始化呢?我的觀點是——應(yīng)該有,這樣容器就可以在調(diào)用其他方法之前至少調(diào)用一個方法來進行初始化。這不僅可以避免不必要的錯誤(由于沒有調(diào)用初始化方法)而且可以使容器更明確的判斷是否可以重用sfsb實例。我暫且把這個問題放一放,規(guī)范組織只考慮為一個方法提供一個注釋來聲明它是一個初始化方法。

      ·對于第二個問題我的觀點也是肯定的。這有利于bean的提供者合客戶端程序?qū)ζ溥M行控制。只有一個遺留的問題:那就是一旦調(diào)用這個方法失敗,是否能移除這個bean 的實例?答案是不能,但是它將會在回話結(jié)束的時候被移除。

      消息驅(qū)動bean

      消息驅(qū)動bean是唯一一種必須實現(xiàn)一個業(yè)務(wù)接口的bean。這個接口指出bean支持的是哪一種消息系統(tǒng)。對于以jms為基礎(chǔ)的mdb來說,這個接口是 javax.jms.messagelistener。注意mdb業(yè)務(wù)接口不是一個真正意義上的業(yè)務(wù)接口,它只是一個消息接口。

      實體bean

      ·實體bean使用@entity注釋來標記,所有實體bean中的屬性/字段不必使用@transient注釋來標記。實體bean的持久化字段可以通過javabean-style機制或者聲明為public/protected字段來實現(xiàn)。

      ·實體bean可以使用助手類來描述其狀態(tài),但是這些類的實例并沒有持久化唯一性(persistent identity)的特性(即,唯一標識這個bean的字段等),實際上這些助手類與他們的實體bean實例是緊密結(jié)合的;并且這些對象還是以非共享方式來訪問實體對象的。

      實體關(guān)聯(lián)

      ejb3.0同時支持bean之間雙向的合單向的關(guān)聯(lián),它們可以是一對一、一對多、多對一或者是多對多的關(guān)聯(lián)。然而雙向關(guān)聯(lián)的兩端還要分為自身端(owning side)和對方端(inverse side)不同的端。自身端負責(zé)向數(shù)據(jù)庫通告關(guān)聯(lián)的變更。對于多對多的關(guān)聯(lián)自身端必須明確的聲明。實際上對方端通過isinverse=true進行注釋(由此自身端就不必說明了而是由另一段推斷出)??磥砩厦娴拿枋?,規(guī)范組織還能說讓ejb變的簡單了嗎?

      o/r映射

      ejb3.0 中的o/r映射模型也有了重要的改變,它從原來的abstract-persistence-schema-based變成了現(xiàn)在的hibernate- inspired模式。盡管目前規(guī)范組織還在就此進行討論但是一個明確的模型將會出現(xiàn)在下一個版本的草案中。

      舉例來說,o/r映射模型將通過bean類中的注釋來聲明。而且此方法還會指出對應(yīng)的具體表和字段。o/r映射模型提供了一套自有的sql;而且除了提供一些基本的sql外還支持某些高層開發(fā)的功能。比如,有一個通過@column注釋聲明的字段columndefinition,那么可以寫這樣的sql: columndefinition="blob not null"

      客戶端程序模型

      一個ejb客戶端可以通過 @inject注釋以一種“注入”的方式獲得一個bean的業(yè)務(wù)接口引用。你也可以使用另一個注釋 @javax.ejb.ejbcontext.lookup()來完成上面的操作,但是規(guī)范中沒有告訴我們一個普通的java客戶端怎樣獲得一個bean 的實例,因為這個普通的java客戶端是運行在一個客戶端容器中,它無法訪問@javax.ejb.ejbcontex對象?,F(xiàn)在還有另外一種機制來完成上面的工作那就是使用一個超級上下文環(huán)境對象:@javax.ejb.context()。但是規(guī)范中沒有指出該如何在客戶端中使用這個對象。

      ejb ql

      ejb ql可以通過@namedquery來注釋。這個注釋有兩個成員屬性分別是name和querystring.一旦定義了這些屬性,就可以通過 entitymanager.createnamedquery(name)來指向這個查詢。你也可以創(chuàng)建一個標準的jdbc風(fēng)格的查詢并使用 entitymanager.createquery(ejbqlstring)或entitymanager.createnativequery (nativesqlstring)(這個方法用于執(zhí)行一個本地查詢)來執(zhí)行查詢。

      ejb ql有兩個地方可以定義其參數(shù)。javax.ejb.query接口提供了定義參數(shù)、指向查詢、更新數(shù)據(jù)等等方法。下面是一個ejbql指向查詢的例子:

    .. ..
    @namedquery(
    name="findallcustomerswithname",
    querystring="select c from customer c where c.name like :custname"
    )
    .. ..
    @inject public entitymanager em;
    customers = em.createnamedquery("findallcustomerswithname")
    .setparameter("custname", "smith")
    .listresults();

      下面列出了一些ejb ql的增強特性:

      ·支持批量更新和刪除。

      ·直接支持內(nèi)連接和外連接。fetch join運行你指出關(guān)聯(lián)的實體,order可以指定只查詢某個字段。

      ·查詢語句可以返回一個以上的結(jié)果值。實際上,你可以返回一個依賴的類比如下面這樣:

    select new customerdetails(c.id, c.status, o.count)
    from customer c join c.orders o
    where o.count > 100

      ·支持group by 和having。

      ·支持where子句的嵌套子查詢。

      在提交的ejb3.0草案中,ejb ql與標準sql非常的接近。實際上規(guī)范中甚至直接支持本地的sql(就像我們上面提到的那樣)。這一點對某些程序員來說也許有些不是很清楚,我們將在下面進行更詳細的講解。

      多樣性

      方法許可(method permissions)可以通過@methodpermissions或@unchecked注釋來聲明;同樣的,事務(wù)屬性也可以通過 @transactionattribute注釋來聲明。規(guī)范中仍然保留資源引用和資源環(huán)境引用。這些一樣可以通過注釋來聲明,但是有一些細微的差別。比如,上下文(context)環(huán)境要通過注入工具控制。容器根據(jù)bean對外部環(huán)境引用自動初始化一個適當?shù)囊呀?jīng)聲明的實例變量。比如,你可以象下面這樣獲得一個數(shù)據(jù)源(datasource):

    @resource(name="mydatasource") //type is inferred from variable
    public datasource customerdb;

      在上面的例子中如果你不指定引用資源的名稱(name)那么其中的customerdb會被認為是默認值。當所有的引用屬性都可得到時,@injec注釋就可以這樣寫:

    @inject public datasource customerdb;

      容器負責(zé)在運行時初始化customerdb數(shù)據(jù)源實例。部署人員必須在此之前在容器中定義好這些資源屬性。

      更好的消息是:那些以前必須檢測的異常將一去不復(fù)返。你可以聲明任意的應(yīng)用程序異常,而不必在再拋出或捕獲其他類似createexception和 finderexception這樣的異常。容器會拋出封裝在javax.ejb.ejbexception中的系統(tǒng)級異?;蛘咧辉诒匾獣r候拋出 illegalargumentexception或illegalstateexception異常。

      ejb文件處理模式

      在我們結(jié)束本節(jié)之前,讓我的快速的瀏覽一下容器提供商在ejb處理模式方面可能的變更。規(guī)范中對此并沒有明確的表態(tài),但我可以想到至少兩種模式。

      ·一種辦法是首先利用ejb文件生成類似于ejb2.1部署模式的文件(包括必要的接口和部署描述符)然后再用類似于ejb2.1的方式來部署這個ejb組件。當然,這樣產(chǎn)生的部署描述符可能并不標準但是它可以解決同一個容器對ejb2.1和ejb3.0兼容的問題。

      ·另一種方法是一種類似于jsp托放的部署模式。你可以把一個ejb文件放到一個預(yù)先定義的目錄下,然后容器會識別這個ejb并處理它,然后部署并使之可以使用。這種方法可以建立于上面那種方法之上,在支持反復(fù)部署時有很大的幫助??紤]到部署的簡單性也是ejb3.0規(guī)范的目的之一,我真誠的希望在下一個草案出來時能夠確定一個模式(至少能有一個非正式的)。

      你有什么想法?

      ejb3.0規(guī)范的制定正在有序的進行,為了使 ejb的開發(fā)變得更加容易,ejb規(guī)范組織作出的努力是有目共睹的。就像他們說的那樣,一切對會變得簡單,但做到這一點并不容易。目前已經(jīng)定義了50個注釋標記(還有幾個將在下一個草案中發(fā)布),每一個都有自己的缺省規(guī)則和其他的操作。當然,我真的不希望ejb3.0變成ejb2.1的一個翻版"ejb 3.0 = ejb 2.1 for dummies"(希望這個等式不要成立)。最后,我還是忍不住要提一些我自己的觀點:

      ·首先,規(guī)范確實使反復(fù)部署變得容易了,并且有一個簡單的模式來訪問運行時環(huán)境。我還是覺得home接口應(yīng)該放棄。

      ·在早期的ejb規(guī)范中,實體bean用于映射一個持久化存儲。理論上(也許只是理論上)可能需要把實體bean映射到一個遺留的eis (enterprise information system)系統(tǒng)中。出于將來擴展的考慮這樣作是有好處的,并且可以使更多的業(yè)務(wù)數(shù)據(jù)模型采用實體bean。也因此其伴隨的復(fù)雜性使得實體bean不被看好。在本次提交的草案中,一個實體bean只是一個數(shù)據(jù)庫的映射。并且是基于非抽象持久化模式和簡單的數(shù)據(jù)訪問模式的更加簡單開發(fā)。

      ·我對模型變更持保留態(tài)度,我認為在ejb中包含sql腳本片斷并不是個好注意。一些開發(fā)人員完全反對包含某些“sql片段(sqlness)”(比如 @table 和 @column注釋)。我的觀點是這些sqlness是好的,據(jù)此我們可以清楚的知道我們到底要數(shù)據(jù)庫作些什么。但是某些sql段我看來并不是很好,比如 columndefinition="blob not null",這使得ejb代碼和sql之間的耦合太過緊密了。

      ·盡管對于本地sql的支持看似很誘人,其實在ejb代碼中嵌入sql是一個非常糟糕的主意。當然,有些辦法可以避免在ejb中硬編碼sql,但是這應(yīng)該在規(guī)范中說明,而不能是某些開發(fā)人員自己定義的模式。

      ·假設(shè)@table注釋只用于類。在運行時通過@table注釋的name屬性定義的表名稱將必須對應(yīng)一個實際的數(shù)據(jù)庫表。規(guī)范對此應(yīng)該給予清楚的說明和一致的模式。

      ·規(guī)范還需要更清楚的說明客戶端編程模型,尤其是普通java客戶端。規(guī)范中所有的參考都假設(shè)或者隱含的使用ejb客戶端。而且規(guī)范中對客戶端的向后兼容方面也沒有給出明確的說法。

      ·transient注釋應(yīng)該重新命名以避免和已有的transient關(guān)鍵字發(fā)生沖突。事實上,在這一點上我們更樂于稍微的背離一下 configuration-by-exception原則并且定義一個@persistent注釋來明確的定義持久化字段。@persistent注釋可以僅僅是一個標記注釋或者它可以有幾個屬性來關(guān)聯(lián)o/r映射注釋。

      與其他規(guī)范的關(guān)聯(lián)

      目前可能影響到ejb3.0的jsr有jsr175(java語言元數(shù)據(jù)工具)和jsr181(java web服務(wù)元數(shù)據(jù))

      jsr175已經(jīng)初步完成并且不會和ejb3.0有太大的沖突;但是jsr181與ejb3.0有兩個關(guān)聯(lián)的地方:

      ·web service接口:ejb規(guī)范將采用一種機制適應(yīng)jsr181以便可以把一個bean實現(xiàn)為一個web service并告訴web service如何被客戶端調(diào)用。

      ·jsr 181計劃采用不同的機制來處理安全問題。在早期的規(guī)范中ejb建議使用一個一致的機制(methodpermissions),但是jsr 181計劃使用一個稍微不同的方式(securityroles和securityidentity注釋)。同樣的runas注釋的定義也存在這些許差別。這一問題還在解決中最終會在j2ee層的規(guī)范中維持其一致性。

      在j2ee 1.5中的一些開發(fā)規(guī)范可能與ejb3.0有關(guān)聯(lián)。除了上面說到的幾個關(guān)聯(lián)之外現(xiàn)在沒有其他的開發(fā)規(guī)范與ejb3.0有沖突。

      結(jié)束語

      在使ejb的開發(fā)變得簡單高效之前,我們還有很長一段路要走。規(guī)范組織在降低ejb的開發(fā)難度方面起了個好頭。o/r映射模型的提議還處在早期階段,規(guī)范組織正在完善它。我希望它不要太復(fù)雜也不要與sql過分的耦合。讓我們不要只是停留在期望、希望、思考和請求中:提出你的想法并把你的建議發(fā)送給規(guī)范組織 [email protected]。jcp并不是很民主的組織,但是你的建議一定是有價值的。

    發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 建昌县| 修文县| 大丰市| 焉耆| 鹿邑县| 化德县| 磴口县| 顺义区| 泸定县| 晋中市| 马尔康县| 保山市| 宁德市| 澄迈县| 德格县| 泌阳县| 时尚| 拉萨市| 梁平县| 社旗县| 鄂托克旗| 项城市| 唐河县| 肃宁县| 香河县| 曲靖市| 永和县| 林州市| 安康市| 汶上县| 简阳市| 金阳县| 漯河市| 南宁市| 泰顺县| 潼关县| 区。| 永靖县| 盐津县| 确山县| 南昌县|