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)入討論組討論。 @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)入討論組討論。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注