1. 程式人生 > >EJB3.0和EJB2.1有哪些區別

EJB3.0和EJB2.1有哪些區別

本文從實戰角度比較EJB2和EJB3的異同,通過深入剖析揭示EJB3.0的真相,EJB3.0真是帶來簡化?還是一種表象上的簡化?EJB3.0真的變得輕量了,還是披著羊皮的狼?

  EJB程式設計模型的簡化

  首先,EJB3簡化的一個主要表現是:在EJB3中,一個EJB不再象EJB2中需要兩個介面一個Bean實現類,雖然我們以前使用JBuilder這樣視覺化開發工具自動生成了EJB2的這三個類,好像不覺得複雜,但是當EJB個數增加時,就顯得累贅了。

  簡化後的EJB3的sessionBean依靠annotations元註釋來定義SessionBean的型別,也就是說,EJB2中的SessionBean型別區分在EJB3繼續繼承,只不過書寫程式碼的方式不同而已,例如下程式碼使用@Stateless表示一個無狀態Bean.

 package example;

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

    System.out.println("hello");  

  }

}

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

  在EJB2中,一個EJB物件的呼叫需要經過兩個步驟:JNDI尋找和工廠建立,如下例:

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

bean.xxxx();//真正目的 物件使用

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

下面是annotations+Ioc/DI的EJB3呼叫程式碼:

 @EJB //注意這裡後面是空白
private TestSessionLocal testbean; //使用介面宣告

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

}

  上述EJB3呼叫程式碼中,@EJB後面是空白,這其實使用了TestSessionLocal的預設JNDI名稱,一直到這裡,我們一直滿足於EJB3的簡化,但是如果研究@EJB語法後,會發現其完整寫法如下:

 @EJB(
name = “ejb/shopping-cart”,//被呼叫者Cart實現類的ejb-reference名稱
beanName = “cart1”, //被呼叫者的名稱 beanName
beanInterface = ShoppingCart.class, //介面名稱
description = “The shopping cart for this application”
)
private Cart myCart;

  上述完整@EJB寫法適用於同一個介面有多個實現子類時,其中關鍵是 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實現子類(不帶包名)/local,如果是remote呼叫,就是remote. 如果這個EJB被打包在jar包中,那麼JNDI名稱就是EJB-CLASS-NAME/local and EJB-CLASS-NAME/remote,當然,作為替換@RemoteBinding 和 @LocalBinding 也可定義JNDI名稱。

  也就是說:JBoss的EJB3中,如果你不使用XML配置,直接使用annotations,那麼JNDI預設名稱沒有一個統一規定名稱,有的可以直接是類名;在JBoss中還和EJB打包的形式有關,是動態變化的。如果你以為在EJB3中不會接觸到這個變化的JNDI預設名稱,那你就錯了。

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

 JNDI Naming Context

  無論J2EE還是Java EE中,JNDI是一個好像不起眼,但是極其重要的概念,不理解JNDI可以說,對J2EE或JavaEE只瞭解一半。

  JNDI本來是EJB2中比較複雜的一個概念,不同容器有自己的JNDI名稱,由此EJB2引入了第三者EJB-Reference,雖然解決了程式碼中耦合JNDI名稱問題,但是又帶來了更加煩瑣的配置,這種現象當然被JavaEE5.0繼續繼承了下來,問題遠非這麼簡單。

  J在Java EE5.0中(包括EJB3和Web環境),當我們需要訪問一個JNDI環境下資源時,有兩種方式:除了傳統EJB2中的JNDI呼叫方式;還有一種就是:使用依賴注射Ioc模式,這個依賴注射的表達方式是使用annotations.

  因此,在EJB3中,必須好好搞清楚annotations、依賴注射和JNDI之間的關係,如果這個問題不弄明白,EJB3就絕非EJB2那麼容易搞定,當然,搞定了的結果很簡單,讓人感覺簡化輕量了,真不知道EJB3這種簡化是不是有點象“掩耳盜鈴”。

  可以總結一句:凡是EJB2中使用配置檔案定義的;EJB3一般都可以使用 annotations定義(當然EJB3也支援配置檔案定義);凡是EJB2通過JNDI尋找的資源(呼叫容器中其他EJB、呼叫環境變數等Resource資源等),都是可以依靠annotations+依賴注射機制完成。

  JPA替代實體Bean

  。如果說EJB3與EJB2變化最大的部分,就是持久層使用Java Persistence API 替代了EJB2的實體Bean,這樣,我們通過Evans DDD建模得到的Domain Model類可以直接持久化儲存到資料庫,不像EJB2中還需要在Model類和實體Bean中進行一次轉換。

  EJB3引入EntityManager進行需要持久實體的查詢及其新增修改;EntityManager非常類似JDBCTemp/HibernateTemplate等持久化模板。

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

  雖然在JPA中,我們都可以使用Annotation來替代配置,實現很多過去需要專門配置檔案才能實現功能,不再一定需要 每個伺服器不同的cmp對映檔案,增強了移植性,但是EJB3還是需要 一個叫persistence.xml配置檔案,在這個配置中進行資料庫JNDI配置;當然,還有一些和具體伺服器有關的配置屬性,如果使用JBoss,JBoss的JPA底層使用Hibernate實現,因此在persistence.xml要進行有關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.0EJB2.1哪些區別

本文從實戰角度比較EJB2和EJB3的異同,通過深入剖析揭示EJB3.0的真相,EJB3.0真是帶來簡化?還是一種表象上的簡化?EJB3.0真的變得輕量了,還是披著羊皮的狼?   EJB程式設計模型的簡化   首先,EJB3簡化的一個主要表現是:在EJB3中,一個EJB不再象

SHELL中的exit 0 exit 1什麼區別

當你 exit 0 的時候,在呼叫環境 echo $? 就返回0,也就是說呼叫環境就認為你的這個程式執行正確 當你 exit 1 的時候,一般是出錯定義這個1,也可以是其他數字,很多系統程式這個錯誤編號是有約定的含義的。 但不為0 就表示程式執行出錯。 呼叫環境就可以根據這

CentOS7CentOS6具體哪些區別?我來分析分析,CentOS7上手不是問題

CentOS7和CentOS6的區別首先,先介紹一下CentOS7的鏡像,本文中,我們使用的是CentOS7.2的鏡像CentOS7的下載地址可以從以下這個地址下載http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1708.i

thinkPHP3.2TP3.1什麼區別

3.2版本在此前的3.1.3版本之上,引入了名稱空間,強化了驅動化和行為,增強了模組化的概念和對雲平臺的支援,並改進了諸多的細節。 主要改進包括: 模組化架構的全新設計 全新名稱空間和自動匯入機制 改進的路由功能 主題的動態切換支援 更強大的Action引數繫結

Java開發中SessionCookie都哪些區別?

1.背景介紹 什麼是CookieCookie 是在HTTP協議下,伺服器或指令碼可以維護客戶工作站上資訊的一種方式。Cookie 是由 Web伺服器儲存在使用者瀏覽器(客戶端)上的小文字檔案(內容通常經過加密),它可以包含有關使用者的資訊。無論何時使用者連結到伺服器,Web站點都可以訪問

C語言中exit(0)與exit(1)什麼區別

今天天氣有點冷,當我在寫訊息佇列的程式的時候,遇到了結束程序的這個問題,突然腦海裡有點混亂,我是用_exit(),還是用exit(1),還是用exit(0)呢,然後自己度娘了一下,整理了一下稍微做

Executors的newSingleThreadExecutor()newFixedThreadPool(1)什麼區別

看了下FinalizableDelegatedExecutorService,就是多了個gc時停掉執行緒池的功能。static class FinalizableDelegatedExecutorService extends DelegatedExecutorService {

MAC系統PKG檔案DMG檔案哪些區別&VMWare安裝Mac OS

  MAC系統中的檔案包含著兩種格式,一種PKG檔案,還有一種便是DMG檔案。許多使用者都對這兩種格式的檔案分不清,認為它們是同一種類型的檔案。其實並不是這樣的,今天,小編就為大家介紹一下這兩個格式檔案的區別。  關於PKG   pkg檔案也就是安裝包配置檔案,是製作

java中 a=a+1;a+=1;什麼區別

short a = 1; //先檢查是否在short範圍內,如果在,再轉換,砍掉高位,進行賦值 a + = 1;//同上 a = a + 1; //它不做轉換,而且是兩次運算 //以上兩句的區別是:

雲伺服器虛擬主機哪些區別

虛機主機就是利用技術把一臺伺服器分成多個“虛擬”的主機,這些劃分出來的主機具有獨立的域名,和具有完整的Internet伺服器功能,劃分出來的虛擬主機共享伺服器的寬頻和IP。虛機主機之所以使用率較高

運算放大器儀表放大器哪些區別

儀表放大器這一術語經常被誤用,它指的是器件的應用,而非器件的架構。在過去,任何被認為精準(即,實現某種輸入失調校正)的放大器都被視為“儀表放大器”,這是因為它被設計為用於測量系統。儀表放大器(即 INA)與運算放大器(運放)相關,因為二者基於相同的基本構件。但 INA 是

HTTP1.0HTTP1.1區別

project med -s 允許 它的 頁面 報告 實體 host 區別一、HTTP 1.0只支持短連接而HTTP 1.1支持持久連接 HTTP 1.0規定瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器完成請求處理後立即斷開TCP

centos 6centos 7的哪些區別

centos7和centos6區別1、默認文件系統CentosCentos7影響默認文件系統ext4xfs大量小文件在ext4上工作性能較好在64位linux中,ext4最大支持16TB的文件,xfs最大支持8EB的文件防火墻iptablesfirewalld原來使用iptables,現在在CentOS 7中

framework中哪些內容,.framework.a文件哪些區別

inf 文件的 建議 list dylib header 可執行文件 log app 一、framework中有哪些內容 1. Headers 頭文件 2. info.plist (動態庫沒有) 3. Mudues 4. 可執行文件 二、 1、類庫可分為動態庫(.dyl

JAVA中局部變量 成員變量哪些區別

生命 bsp oda oid 出了 默認值 diff 就會 棧內存 JAVA中局部變量 和 成員變量有哪些區別 1.定義的位置不一樣<重點>***局部變量:在方法的內部成員變量:在方法的外部,直接寫在類當中 2.作用範圍不一樣<重點>***局部變量:

鏈路追蹤應用性能監控哪些區別

開發者工具 jpeg 水平 form 阿裏 qfile 面向 ati 表格 概要 阿裏雲上最近推出了一款新產品 鏈路追蹤 ,專註於幫助開發者快速分析和診斷分布式應用架構下的性能瓶頸,提高微服務時代下的開發診斷效率。 分布式應用環境下的鏈路追蹤,並不是一個新話題。在早些時間

轉:HTTP請求的過程&HTTP/1.0HTTP/1.1區別&HTTP怎麼處理長連線

1.HTTP簡介   web瀏覽器和伺服器之類的互動過程必須遵守的協議.他是tcp/ip中的一個應用協議。用來協議資料交換過程和資料本身的格式.主要的有HTTP/1.0和HTTP1.1.   HTTP/1.0和HTTP/1.1都把TCP作為底層的傳輸協議。   HTTP客戶首先

springClouddubbo哪些區別?

原 https://blog.csdn.net/anningzhu/article/details/76599875 一.兩者的模組組成: 1、Dubbo主要分為服務註冊中心,服務提供者,服務消費者,還有管控中心; 2、相比起Dubbo簡單的四個模組,SpringCloud則是一個完

最小二乘法梯度下降法哪些區別

https://www.zhihu.com/question/20822481 最小二乘法的目標:求誤差的最小平方和,對應有兩種:線性和非線性。線性最小二乘的解是closed-form即,而非線性最小二乘沒有closed-form,通常用迭代法求解。 迭代法,即在每一步update未知量逐漸

oa系統ERP的區別聯系哪些

無法 單純 自動 利潤 網絡 出發 需求 采購 應用軟件 隨著信息化的發展,越來越多的企業使用網絡應用軟件來輔助辦公,目的是為了提高工作效率,節省辦公時間,促進企業經濟效益增長。例如oa系統、ERP等等,但是有些人至今無法區分它們之間的聯系與區別。下面具體說說oa系統和ER