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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

EJB3.0概覽以及新版本的諸多進(jìn)步

2019-11-18 12:34:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  引言
  期待以久的EJB3.0規(guī)范在最近發(fā)布了它的初稿。在本文中將對(duì)新的規(guī)范進(jìn)行一個(gè)概要性的介紹,包括新增的元數(shù)據(jù)支持,EJBQL的修改,實(shí)體Bean模型訪(fǎng)問(wèn)bean上下文的新方法和運(yùn)行時(shí)環(huán)境等等。作者還討論了EJB在未來(lái)要作出的調(diào)整以及EJB3.0與其他開(kāi)發(fā)規(guī)范之間的關(guān)系。
  
  開(kāi)始
  無(wú)論如何由于EJB的復(fù)雜性使之在J2EE架構(gòu)中的表現(xiàn)一直不是很好。EJB大概是J2EE架構(gòu)中唯一一個(gè)沒(méi)有兌現(xiàn)其能夠簡(jiǎn)單開(kāi)發(fā)并提高生產(chǎn)力的組建。EJB3.0規(guī)范正嘗試在這方面作出努力以減輕其開(kāi)發(fā)的復(fù)雜性。EJB3.0減輕了開(kāi)發(fā)人員進(jìn)行底層開(kāi)發(fā)的工作量,它取消或最小化了很多(以前這些是必須實(shí)現(xiàn))回調(diào)方法的實(shí)現(xiàn),并且降低了實(shí)體Bean及O/R映射模型的復(fù)雜性。
  
  在本文中,我首先會(huì)介紹EJB3.0中幾個(gè)主要的改變。它對(duì)進(jìn)一步深入了解EJB3.0是非常重要的。隨后,我會(huì)從更高的層面來(lái)描述已經(jīng)被提交到EJB3.0規(guī)范中的細(xì)節(jié),并一個(gè)個(gè)的講解新的規(guī)范中的改變:實(shí)體Bean,O/R映射模型,實(shí)體關(guān)系模型和EJB QL(EJB查詢(xún)語(yǔ)言)等等。
  
  背景
  EJB3.0中兩個(gè)重要的變更分別是:使用了java5中的程序注釋工具和基于Hibernate的O/R映射模型。
  
  Java5中的元數(shù)據(jù)工具。
  
  Java5(以前叫J2SE1.5或Tiger)中加入了一種新的程序注釋工具。通過(guò)這個(gè)工具你可以自定義注釋標(biāo)記,通過(guò)這些自定義標(biāo)記來(lái)注釋字段、方法、類(lèi)等等。這些注釋并不會(huì)影響程序的語(yǔ)義,但是可以通過(guò)工具(編譯時(shí)或運(yùn)行時(shí))來(lái)解釋這些標(biāo)記并產(chǎn)生附加的內(nèi)容(比如部署描述文件),或者強(qiáng)制某些必須的運(yùn)行時(shí)行為(比如EJB組件的狀態(tài)特性)。注釋的解析可以通過(guò)源文件的解析(比如編譯器或這IDE工具)或者使用Java5中的APIs反射機(jī)制。注釋只能被定義在源代碼層。由于所有被提交到EJB3.0草案中的注釋標(biāo)記都有一個(gè)運(yùn)行時(shí)的RetentionPolicy,因此會(huì)增加類(lèi)文件占用的存儲(chǔ)空間,但這卻給容器制造商和工具制造商帶來(lái)了方便。
  
  Hibernate
  
  目前Hibernate非常受歡迎,它是開(kāi)發(fā)源代碼的Java O/R映射框架,目的是把開(kāi)發(fā)人員從繁瑣的數(shù)據(jù)持久化編程中解脫出來(lái)。它也有一個(gè)標(biāo)準(zhǔn)的HQL(Hibernate 查詢(xún)語(yǔ)言)語(yǔ)言,你可以在新的EJB QL中看到它的影子。Hibernate在處理如數(shù)據(jù)查詢(xún)、更新、連接池、事務(wù)處理、實(shí)體關(guān)系處理等方面非常簡(jiǎn)單。
  
  概覽
  在已經(jīng)提交的EJB3.0規(guī)范中主要涉及兩個(gè)方面的改變:
  
  1.一套以注釋為基礎(chǔ)的EJB編程模型,再加上EJB2.1中定義的通過(guò)部署描述符和幾個(gè)接口定義的應(yīng)用程序行為。
  
  2.新的實(shí)體Bean持久化模型,EJBQL也有許多重要的改變。
  
  還有一些有關(guān)上述的提議,比如:一個(gè)新的客戶(hù)端編程模型,業(yè)務(wù)接口的使用以及實(shí)體Bean的生命周期。請(qǐng)注重EJB2.1編程模型(包括部署描述符和home/remote接口)仍然是有效的。新的簡(jiǎn)化模型并沒(méi)有完全取代EJB2.1模型。
  
  EJB注釋
  EJB規(guī)范組織一個(gè)重要的目標(biāo)是減輕原始代碼的數(shù)量,并且他們?yōu)榇私o出了一個(gè)完美而簡(jiǎn)介的辦法。在EJB3.0的里,任何類(lèi)型的企業(yè)級(jí)Bean只是一個(gè)加了適當(dāng)注釋的簡(jiǎn)單Java對(duì)象(POJO)。注釋可以用于定義bean的業(yè)務(wù)接口、O/R映射信息、資源引用信息,效果與在EJB2.1中定義部署描述符和接口是一樣的。在EJB3.0中部署描述符不再是必須的了;home接口也沒(méi)有了,你也不必實(shí)現(xiàn)業(yè)務(wù)接口(容器可以為你完成這些事情)。
  
  比如,你可以使用@Stateless注釋標(biāo)記類(lèi)把Java類(lèi)聲明為一個(gè)無(wú)狀態(tài)回話(huà)bean。對(duì)于有狀態(tài)回話(huà)bean來(lái)說(shuō),@Remove注釋可以用來(lái)標(biāo)記一個(gè)特定的方法,通過(guò)這個(gè)注釋來(lái)說(shuō)明在調(diào)用這個(gè)方法之后bean的實(shí)例將被清除掉。
  
  為了減少描述組件的說(shuō)明信息,規(guī)范組織還采納了由異常進(jìn)行配置(configuration-by-exception)的手段,意思是你可以為所有的注釋提供一個(gè)明確的缺省值,這樣多數(shù)常規(guī)信息就可以據(jù)此推斷得出。
  
  新的持久化模型
  新的實(shí)體bean也是一個(gè)加了注釋的簡(jiǎn)單Java對(duì)象(POJO)。一旦它被EntityManager訪(fǎng)問(wèn)它就成為了一個(gè)持久化對(duì)象,并且成為了持久化上下文(context)的一部分。一個(gè)持久化上下文與一個(gè)事務(wù)上下文是松耦合的;嚴(yán)格的講,它隱含的與一個(gè)事務(wù)會(huì)話(huà)共存。
  
  實(shí)體關(guān)系也是通過(guò)注釋來(lái)定義的,O/R映射也是,并提供幾種不同的數(shù)據(jù)庫(kù)規(guī)范操作,在EJB2.1中這些要通過(guò)開(kāi)發(fā)人員自己的設(shè)計(jì)模式或者其它技術(shù)來(lái)完成的(比如,自增長(zhǎng)主鍵策略)。
  
  深入研究
  現(xiàn)在是時(shí)候具體了解EJB3.0草案了。讓我們開(kāi)始探討所有EJB中四種企業(yè)級(jí)bean,并看看他們?cè)谛碌囊?guī)范中是什么樣子。
  
  無(wú)狀態(tài)回話(huà)bean
  在EJB3.0規(guī)范中,寫(xiě)一個(gè)無(wú)狀態(tài)回話(huà)bean(SLSB)只需要一個(gè)簡(jiǎn)單的Java文件并在類(lèi)層加上@Stateless注釋就可以了。這個(gè)bean可以擴(kuò)展javax.ejb.sessionBean接口,但這些不是必須的。
  
  一個(gè)SLSB不再需要home接口,沒(méi)有哪類(lèi)EJB再需要它了。Bean類(lèi)可以實(shí)現(xiàn)業(yè)務(wù)接口也可以不實(shí)現(xiàn)它。假如沒(méi)有實(shí)現(xiàn)任何業(yè)務(wù)接口,業(yè)務(wù)接口會(huì)由任意public的方法產(chǎn)生。假如只有幾個(gè)業(yè)務(wù)方法會(huì)被暴露在業(yè)務(wù)接口中,這些方法可以使用@BusinessMethod注釋。缺省情況下所有產(chǎn)生的接口都是local(本地)接口,你也可以使用@Remote注釋來(lái)聲明這個(gè)接口為remote(遠(yuǎn)程)接口。
  
  下面的幾行代碼就可以定義一個(gè)HelloWorldbean了。而在EJB2.1中同樣的bean至少需要兩個(gè)接口,一個(gè)實(shí)現(xiàn)類(lèi)和幾個(gè)空的實(shí)現(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)回話(huà)bean
  除了幾個(gè)SFSB的非凡說(shuō)明之外,有狀態(tài)回話(huà)bean(SFSB)和SLSB一樣精簡(jiǎn):
  
  一個(gè)SFSB應(yīng)該有一個(gè)方法來(lái)初始化自己(在EJB2.1中是通過(guò)ejbCreate()來(lái)實(shí)現(xiàn)的)。在EJB3.0的規(guī)范中建議這些初始化操作可以通過(guò)自定義方法完成,并把他們暴露在業(yè)務(wù)接口中。在使用這個(gè)bean之前由客戶(hù)端來(lái)調(diào)用相應(yīng)的初始化方法。目前規(guī)范組織就是否提供一個(gè)注釋來(lái)標(biāo)記某個(gè)方法用于初始化還存在爭(zhēng)議。
  
  Bean的提供者可以用@Remove注釋來(lái)標(biāo)記任何SFSB的方法,以說(shuō)明這個(gè)方法被調(diào)用之后bean的實(shí)例將被移除。同樣,規(guī)范組織仍然在討論是否要有一種機(jī)制來(lái)處理這種非凡的情況,即當(dāng)這個(gè)方法出現(xiàn)異常的情況下bean的實(shí)例是否被移除。
  
  下面是對(duì)以上問(wèn)題我個(gè)人的觀(guān)點(diǎn):
  是否應(yīng)該有一個(gè)注釋來(lái)標(biāo)明一個(gè)方法進(jìn)行初始化呢?我的觀(guān)點(diǎn)是――應(yīng)該有,這樣容器就可以在調(diào)用其他方法之前至少調(diào)用一個(gè)方法來(lái)進(jìn)行初始化。這不僅可以避免不必要的錯(cuò)誤(由于沒(méi)有調(diào)用初始化方法)而且可以使容器更明確的判定是否可以重用SFSB實(shí)例。我暫且把這個(gè)問(wèn)題放一放,規(guī)范組織只考慮為一個(gè)方法提供一個(gè)注釋來(lái)聲明它是一個(gè)初始化方法。
  
  對(duì)于第二個(gè)問(wèn)題我的觀(guān)點(diǎn)也是肯定的。這有利于Bean的提供者合客戶(hù)端程序?qū)ζ溥M(jìn)行控制。只有一個(gè)遺留的問(wèn)題:那就是一旦調(diào)用這個(gè)方法失敗,是否能移除這個(gè)bean 的實(shí)例?答案是不能,但是它將會(huì)在回話(huà)結(jié)束的時(shí)候被移除。
  
  消息驅(qū)動(dòng)Bean
  
  消息驅(qū)動(dòng)Bean是唯一一種必須實(shí)現(xiàn)一個(gè)業(yè)務(wù)接口的Bean。這個(gè)接口指出bean支持的是哪一種消息系統(tǒng)。對(duì)于以JMS為基礎(chǔ)的MDB來(lái)說(shuō),這個(gè)接口是javax.jms.MessageListener。注重MDB業(yè)務(wù)接口不是一個(gè)真正意義上的業(yè)務(wù)接口,它只是一個(gè)消息接口。
  
  實(shí)體Bean
  
  實(shí)體Bean使用@Entity注釋來(lái)標(biāo)記,所有實(shí)體bean中的屬性/字段不必使用@Transient注釋來(lái)標(biāo)記。實(shí)體bean的持久化字段可以通過(guò)JavaBean-style機(jī)制或者聲明為public/PRotected字段來(lái)實(shí)現(xiàn)。
  
  實(shí)體bean可以使用助手類(lèi)來(lái)描述其狀態(tài),但是這些類(lèi)的實(shí)例并沒(méi)有持久化唯一性(persistent identity)的特性(即,唯一標(biāo)識(shí)這個(gè)bean的字段等),實(shí)際上這些助手類(lèi)與他們的實(shí)體bean實(shí)例是緊密結(jié)合的;并且這些對(duì)象還是以非共享方式來(lái)訪(fǎng)問(wèn)實(shí)體對(duì)象的。
  
  實(shí)體關(guān)聯(lián)
  
  EJB3.0同時(shí)支持Bean之間雙向的合單向的關(guān)聯(lián),它們可以是一對(duì)一、一對(duì)多、多對(duì)一或者是多對(duì)多的關(guān)聯(lián)。然而雙向關(guān)聯(lián)的兩端還要分為自身端(owning side)和對(duì)方端(inverse side)不同的端。自身端負(fù)責(zé)向數(shù)據(jù)庫(kù)通告關(guān)聯(lián)的變更。對(duì)于多對(duì)多的關(guān)聯(lián)自身端必須明確的聲明。實(shí)際上對(duì)方端通過(guò)isInverse=true進(jìn)行注釋?zhuān)ㄓ纱俗陨矶司筒槐卣f(shuō)明了而是由另一段推斷出)。看來(lái)上面的描述,規(guī)范組織還能說(shuō)讓EJB變的簡(jiǎn)單了嗎?
  
  O/R映射
  
  EJB3.0中的O/R映射模型也有了重要的改變,它從原來(lái)的abstract-persistence-schema-based變成了現(xiàn)在的Hibernate-inspired模式。盡管目前規(guī)范組織還在就此進(jìn)行討論但是一個(gè)明確的模型將會(huì)出現(xiàn)在下一個(gè)版本的草案中。
  
  舉例來(lái)說(shuō),O/R映射模型將通過(guò)bean類(lèi)中的注釋來(lái)聲明。而且此方法還會(huì)指出對(duì)應(yīng)的具體表和字段。O/R映射模型提供了一套自有的SQL;而且除了提供一些基本的SQL外還支持某些高層開(kāi)發(fā)的功能。比如,有一個(gè)通過(guò)@Column注釋聲明的字段columnDefinition,那么可以寫(xiě)這樣的SQL:columnDefinition="BLOB NOT NULL"
  
  客戶(hù)端程序模型
  
  一個(gè)EJB客戶(hù)端可以通過(guò)@Inject注釋以一種“注入”的方式獲得一個(gè)bean的業(yè)務(wù)接口引用。你也可以使用另一個(gè)注釋@javax.ejb.EJBContext.lookup()來(lái)完成上面的操作,但是規(guī)范中沒(méi)有告訴我們一個(gè)普通的Java客戶(hù)端怎樣獲得一個(gè)Bean的實(shí)例,因?yàn)檫@個(gè)普通

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿坝| 深州市| 池州市| 怀柔区| 平果县| 巴彦淖尔市| 梨树县| 武平县| 惠来县| 稻城县| 兴仁县| 台江县| 老河口市| 崇左市| 济南市| 都昌县| 柞水县| 洛阳市| 广平县| 同仁县| 闽侯县| 嘉义市| 惠来县| 离岛区| 始兴县| 大邑县| 社会| 莱芜市| 城口县| 二手房| 肇源县| 株洲县| 深圳市| 鹤山市| 万盛区| 灵川县| 仙游县| 宽城| 永州市| 霍林郭勒市| 云安县|