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

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

實(shí)戰(zhàn)角度比較EJB2和EJB3的異同

2019-11-18 15:33:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  本文從實(shí)戰(zhàn)角度比較EJB2和EJB3的異同,通過(guò)深入剖析揭示EJB3.0的真相,EJB3.0真是帶來(lái)簡(jiǎn)化?還是一種表象上的簡(jiǎn)化?EJB3.0真的變得輕量了,還是披著羊皮的狼?

  EJB編程模型的簡(jiǎn)化

  首先,EJB3簡(jiǎn)化的一個(gè)主要表現(xiàn)是:在EJB3中,一個(gè)EJB不再象EJB2中需要兩個(gè)接口一個(gè)Bean實(shí)現(xiàn)類,雖然我們以前使用JBuilder這樣可視化開(kāi)發(fā)工具自動(dòng)生成了EJB2的這三個(gè)類,似乎不覺(jué)得復(fù)雜,但是當(dāng)EJB個(gè)數(shù)增加時(shí),就顯得累贅了。

  簡(jiǎn)化后的EJB3的sessionBean依靠annotations元注釋來(lái)定義SessionBean的類型,也就是說(shuō),EJB2中的SessionBean類型區(qū)分在EJB3繼續(xù)繼續(xù),只不過(guò)書(shū)寫(xiě)代碼的方式不同而已,例如下代碼使用@Stateless表示一個(gè)無(wú)狀態(tài)Bean.

 package example;

@Stateless
public class TestSessionBean implements TestSessionLocal{
public void xxxx(){

    System.out.

  }

}

 

  上述Session Bean中沒(méi)有了EJB2中ejbCreate等多余方法,這樣TestSessionBean很象一個(gè)普通javaBeans了。是不是簡(jiǎn)單?先別急,我們需要接著看看這個(gè)TestSessionBean是如何調(diào)用?

  在EJB2中,一個(gè)EJB對(duì)象的調(diào)用需要經(jīng)過(guò)兩個(gè)步驟:JNDI尋找和工廠創(chuàng)建,如下例:

 Context ctx = new InitialContext();
TestSessionLocalHome home = (TestSessionLocalHome)ctx.lookup("java:comp/env/ejb/TestSession");
TestSessionLocal bean = home.create();

bean.xxxx();//真正目的 對(duì)象使用

  其實(shí)上述代碼最后一句才是我們真正目的,但是為了這個(gè)目的,必須經(jīng)過(guò)前面冗長(zhǎng)的代碼創(chuàng)建,而在EJB3中,為創(chuàng)建型模式的Ioc模式(或稱依靠注射)取代了home.create這樣簡(jiǎn)單工廠創(chuàng)建模式,以一種更加松耦合和簡(jiǎn)潔的方式解決了對(duì)象創(chuàng)建問(wèn)題,可以讓我們精力更集中在對(duì)象的使用上了。

進(jìn)入討論組討論。
 

  下面是annotations+Ioc/DI的EJB3調(diào)用代碼:

 @EJB //注重這里后面是空白
private TestSessionLocal testbean; //使用接口聲明

public void invoke(){
  testbean.xxxx(); //直接使用

}

  上述EJB3調(diào)用代碼中,@EJB后面是空白,這其實(shí)使用了TestSessionLocal的缺省JNDI名稱,一直到這里,我們一直滿足于EJB3的簡(jiǎn)化,但是假如研究@EJB語(yǔ)法后,會(huì)發(fā)現(xiàn)其完整寫(xiě)法如下:

 @EJB(
name = “ejb/shopping-cart”,//被調(diào)用者Cart實(shí)現(xiàn)類的ejb-reference名稱
beanName = “cart1”, //被調(diào)用者的名稱 beanName
beanInterface = ShoppingCart.class, //接口名稱
description = “The shopping cart for this application
)
private Cart myCart;

  上述完整@EJB寫(xiě)法適用于同一個(gè)接口有多個(gè)實(shí)現(xiàn)子類時(shí),其中要害是 beanName的定義:beanName是被調(diào)用EJB的類名 (不帶包名,稱為unqualified name ),或者, 假如被調(diào)用EJB有 xml descriptor定義, 它就是配置項(xiàng)ejb-name值(假如你使用過(guò)EJB2,就輕易理解這個(gè)ejb-name了)。

  @EJB還有一個(gè)屬性mappedName,這是被調(diào)用者的JNDI名稱,一般不使用,因?yàn)檫@個(gè)JNDI名稱和具體服務(wù)器有關(guān),假如是JBoss4,那么它的缺省形式是:"EAR-FILE-BASE-NAME/BEAN——CLASS-NAME/local" (or remote)。 也就是:被調(diào)用者EJB所在EAR包的名稱/Bean實(shí)現(xiàn)子類(不帶包名)/local,假如是remote調(diào)用,就是remote. 假如這個(gè)EJB被打包在jar包中,那么JNDI名稱就是EJB-CLASS-NAME/local and EJB-CLASS-NAME/remote,當(dāng)然,作為替換@RemoteBinding 和 @LocalBinding 也可定義JNDI名稱。

  也就是說(shuō):JBoss的EJB3中,假如你不使用XML配置,直接使用annotations,那么JNDI缺省名稱沒(méi)有一個(gè)統(tǒng)一規(guī)定名稱,有的可以直接是類名;在JBoss中還和EJB打包的形式有關(guān),是動(dòng)態(tài)變化的。假如你以為在EJB3中不會(huì)接觸到這個(gè)變化的JNDI缺省名稱,那你就錯(cuò)了。

  JBoss 4 在Servlet中不支持類似EJB調(diào)用EJB那樣的依靠注射 binding-by-injection,因?yàn)閃eb容器和EJB容器是兩個(gè)不同容器,當(dāng)然借助另外JBoss Seam則是另外一回事,因此,在Web層調(diào)用EJB,就必須通過(guò)JNDI綁定一個(gè)session bean,這時(shí),你就必須使用到那個(gè)變化不定的缺省JNDI名稱了。

進(jìn)入討論組討論。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 石城县| 南乐县| 孝感市| 益阳市| 玛曲县| 五莲县| 积石山| 文成县| 河北省| 囊谦县| 达州市| 辛集市| 舟曲县| 彭州市| 旬邑县| 高阳县| 英吉沙县| 屯门区| 徐汇区| 宾川县| 吴旗县| 化州市| 莱芜市| 基隆市| 霍城县| 临夏县| 平湖市| 武清区| 余姚市| 榆中县| 金阳县| 驻马店市| 巫山县| 和顺县| 阳春市| 灵山县| 邮箱| 凤冈县| 息烽县| 左权县| 襄垣县|