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

首頁 > 學院 > 開發(fā)設計 > 正文

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

2019-11-18 15:33:14
字體:
來源:轉載
供稿:網(wǎng)友
EJB編程模型的簡化

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

簡化后的EJB3的sessionBean依靠annotations元注釋來定義SessionBean的類型,也就是說,EJB2中的SessionBean類型區(qū)分在EJB3繼續(xù)繼續(xù),只不過書寫代碼的方式不同而已,例如下代碼使用@Stateless表示一個無狀態(tài)Bean。

package example;

@Stateless

public class TestSessionBean implements TestSessionLocal{

public void xxxx(){

System.out.
}

}

上述Session Bean中沒有了EJB2中ejbCreate等多余方法,這樣TestSessionBean很象一個普通javaBeans了。是不是簡單?先別急,我們需要接著看看這個TestSessionBean是如何調用?

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

Context ctx = new InitialContext();

TestSessionLocalHome home = (TestSessionLocalHome)

ctx.lookup("java:comp/env/ejb/TestSession");

TestSessionLocal bean = home.create();

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

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

下面是annotations+Ioc/DI的EJB3調用代碼:

@EJB //注重這里后面是空白

private TestSessionLocal testbean; //使用接口聲明

public void invoke(){

testbean.xxxx(); //直接使用

}

 

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

@EJB(

name = “ejb/shopping-cart”,//被調用者Cart實現(xiàn)類的ejb-reference名稱

beanName = “cart1”, //被調用者的名稱 beanName

beanInterface = ShoppingCart.class, //接口名稱

description = “The shopping cart for this application

)

private Cart myCart;

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

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

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

JBoss 4 在Servlet中不支持類似EJB調用EJB那樣的依靠注射 binding-by-injection,因為Web容器和EJB容器是兩個不同容器,當然借助另外JBoss Seam則是另外一回事,因此,在Web層調用EJB,就必須通過JNDI綁定一個session bean,這時,你就必須使用到那個變化不定的缺省JNDI名稱了。



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 荔波县| 罗源县| 霍山县| 武邑县| 周至县| 民勤县| 大港区| 绥中县| 包头市| 梅州市| 准格尔旗| 镇沅| 商水县| 金昌市| 亚东县| 高雄市| 孝昌县| 武穴市| 高雄县| 改则县| 宁海县| 明溪县| 兰坪| 潍坊市| 高邑县| 岑溪市| 盈江县| 通河县| 罗定市| 新疆| 诏安县| 化州市| 富平县| 乾安县| 苏州市| 林西县| 武宣县| 墨竹工卡县| 重庆市| 达拉特旗| 久治县|