首先,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(); //直接使用
}
@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名稱了。
新聞熱點
疑難解答