国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
EJB3與EJB2架構(gòu)對(duì)比
 本文從實(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)類(lèi),雖然我們以前使用JBuilder這樣可視化開(kāi)發(fā)工具自動(dòng)生成了EJB2的這三個(gè)類(lèi),好像不覺(jué)得復(fù)雜,但是當(dāng)EJB個(gè)數(shù)增加時(shí),就顯得累贅了。

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

package example;

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

    System.out.println("hello");  

  }

}

  上述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模式(或稱(chēng)依賴(lài)注射)取代了home.create這樣簡(jiǎn)單工廠創(chuàng)建模式,以一種更加松耦合和簡(jiǎn)潔的方式解決了對(duì)象創(chuàng)建問(wèn)題,可以讓我們精力更集中在對(duì)象的使用上了。

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

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

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

}

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

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


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

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

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

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

JNDI Naming Context

  無(wú)論J2EE還是Java EE中,JNDI是一個(gè)好像不起眼,但是極其重要的概念,不理解JNDI可以說(shuō),對(duì)J2EE或JavaEE只了解一半。

  JNDI本來(lái)是EJB2中比較復(fù)雜的一個(gè)概念,不同容器有自己的JNDI名稱(chēng),由此EJB2引入了第三者EJB-Reference,雖然解決了代碼中耦合JNDI名稱(chēng)問(wèn)題,但是又帶來(lái)了更加煩瑣的配置,這種現(xiàn)象當(dāng)然被JavaEE5.0繼續(xù)繼承了下來(lái),問(wèn)題遠(yuǎn)非這么簡(jiǎn)單。

  J在Java EE5.0中(包括EJB3和Web環(huán)境),當(dāng)我們需要訪問(wèn)一個(gè)JNDI環(huán)境下資源時(shí),有兩種方式:除了傳統(tǒng)EJB2中的JNDI調(diào)用方式;還有一種就是:使用依賴(lài)注射Ioc模式,這個(gè)依賴(lài)注射的表達(dá)方式是使用annotations。

  因此,在EJB3中,必須好好搞清楚annotations、依賴(lài)注射和JNDI之間的關(guān)系,如果這個(gè)問(wèn)題不弄明白,EJB3就絕非EJB2那么容易搞定,當(dāng)然,搞定了的結(jié)果很簡(jiǎn)單,讓人感覺(jué)簡(jiǎn)化輕量了,真不知道EJB3這種簡(jiǎn)化是不是有點(diǎn)象”掩耳盜鈴“。

  可以總結(jié)一句:凡是EJB2中使用配置文件定義的;EJB3一般都可以使用 annotations定義(當(dāng)然EJB3也支持配置文件定義);凡是EJB2通過(guò)JNDI尋找的資源(調(diào)用容器中其他EJB、調(diào)用環(huán)境變量等Resource資源等),都是可以依靠annotations+依賴(lài)注射機(jī)制完成。

JPA替代實(shí)體Bean

.   如果說(shuō)EJB3與EJB2變化最大的部分,就是持久層使用Java Persistence API 替代了EJB2的實(shí)體Bean,這樣,我們通過(guò)Evans DDD建模得到的Domain Model類(lèi)可以直接持久化保存到數(shù)據(jù)庫(kù),不像EJB2中還需要在Model類(lèi)和實(shí)體Bean中進(jìn)行一次轉(zhuǎn)換。

  EJB3引入EntityManager進(jìn)行需要持久實(shí)體的查詢(xún)及其新增修改;EntityManager非常類(lèi)似JDBCTemp/HibernateTemplate等持久化模板。

  JPA和JDO以及Hibernate等O/R mapping框架都是非常相似的。

  雖然在JPA中,我們都可以使用Annotation來(lái)替代配置,實(shí)現(xiàn)很多過(guò)去需要專(zhuān)門(mén)配置文件才能實(shí)現(xiàn)功能,不再一定需要 每個(gè)服務(wù)器不同的cmp映射文件,增強(qiáng)了移植性,但是EJB3還是需要 一個(gè)叫persistence.xml配置文件,在這個(gè)配置中進(jìn)行數(shù)據(jù)庫(kù)JNDI配置;當(dāng)然,還有一些和具體服務(wù)器有關(guān)的配置屬性,如果使用JBoss,JBoss的JPA底層使用Hibernate實(shí)現(xiàn),因此在persistence.xml要進(jìn)行有關(guān)Hibernate屬性配置:

<persistence>
  <persistence-unit name="Ejb3Tutorial">
    <jta-data-source>java:/TestDS</jta-data-source>
    <properties>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    </properties>
  </persistence-unit>
</persistence>

攔截器概念

  EJB3.0引入了類(lèi)似AOP中的攔截器概念(注意,AOP不只等于攔截器,所以不能認(rèn)為EJB3就是完全AOP了),JBoss使用JBossAOP來(lái)實(shí)現(xiàn)攔截器功能,自己定義的攔截器方法可以攔截任何一個(gè)業(yè)務(wù)方法或生命周期事件回調(diào);攔截方法可以在bean中定義或?qū)iT(mén)的攔截器類(lèi)。

@Stateless
@Interceptors( { NullChecker.class, ArgumentsChecker.class })
public class StatelessSessionBean implements StatelessSession {

  // This business method is called after
  // the above two interceptor‘s @AroundInvoke
  // methods are invoked. Hence it is guaranteed
  // that the argument to this method is not null
  // and it starts with a letter
  public String initUpperCase(String val) {
    String first = val.substring(0, 1);
    return first.toUpperCase() + val.substring(1);
  }

}

  NullChecker和ArgumentsChecker是StatelessSessionBean兩個(gè)攔截器,在攔截器NullChecker中,必須指定的攔截方法為@AroundInvoke。

public class NullChecker {

  @AroundInvoke
  public Object checkIfNull(InvocationContext ctx)
        throws Exception {
      Method method = ctx.getMethod();
      if (method.getName().equals("initUpperCase")) {
        String param = (String) (ctx.getParameters()[0]);
      }
       .........

      }
       // Proceed to the next interceptor
      return ctx.proceed();
  }

}

總結(jié)

  總之,從上面EJB2和EJB3的總結(jié)上看,EJB3.0在EJB2基礎(chǔ)上,引入了更多概念,最大變化就是Annotation替代了配置文件,對(duì)于一些配置文件厭惡者來(lái)說(shuō),是一個(gè)好事;但是在實(shí)戰(zhàn)中,在一些依賴(lài)注射不能照顧到地方,我們還必須和更加復(fù)雜的JNDI名稱(chēng)打交道,這恐怕是EJB3的一個(gè)不是很完美的地方。

  關(guān)于EJB3中可測(cè)試性的優(yōu)點(diǎn)被很多人津津樂(lè)道,將EJB脫離容器測(cè)試,雖然可以進(jìn)行微觀的單元測(cè)試,但是脫離容器就是脫離特定完整的業(yè)務(wù)場(chǎng)景,所以,基于容器的(也就是基于完整的業(yè)務(wù)場(chǎng)景)單點(diǎn)跟蹤調(diào)試才是最重要的,這些必須依賴(lài)開(kāi)發(fā)工具的發(fā)展,目前已經(jīng)在Eclipse3.2以后版本+WPT(或JBossIDE/Lomboz)中實(shí)現(xiàn),這個(gè)功能適合大部分J2EE/JavaEE程序。 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
EJB3.0開(kāi)發(fā)指南之有狀態(tài)會(huì)話Bean(轉(zhuǎn)) - JRen大鵬一曰同風(fēng)起,扶搖直上九萬(wàn)里...
J2EE容器,EJB、JNDI概念掃盲
pojo應(yīng)用框架:spring vs. ejb 3.0(翻譯文章,原創(chuàng))
jboss相關(guān)的ejb配置引用完全說(shuō)明.包括jboss-web.xml,ejb-jar.xml等.
第一個(gè)EJB3.0范例
EJB3.0中JNDI的綁定和多通路傳輸
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服