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 System.out.println("hello"); } } |
上述Session Bean中沒有了EJB2中ejbCreate等多餘方法,這樣TestSessionBean很象一個普通JavaBeans了。是不是簡單?先別急,我們需要接著看看這個TestSessionBean是如何呼叫?
在EJB2中,一個EJB物件的呼叫需要經過兩個步驟:JNDI尋找和工廠建立,如下例:
Context ctx = new InitialContext(); bean.xxxx();//真正目的 物件使用 |
其實上述程式碼最後一句才是我們真正目的,但是為了這個目的,必須經過前面冗長的程式碼建立,而在EJB3中,為建立型模式的Ioc模式(或稱依賴注射)取代了home.create這樣簡單工廠建立模式,以一種更加鬆耦合和簡潔的方式解決了物件建立問題,可以讓我們精力更集中在物件的使用上了。
下面是annotations+Ioc/DI的EJB3呼叫程式碼:
@EJB //注意這裡後面是空白 public void invoke(){ } |
上述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.0和EJB2.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 就表示程式執行出錯。 呼叫環境就可以根據這
CentOS7和CentOS6具體有哪些區別?我來分析分析,CentOS7上手不是問題
CentOS7和CentOS6的區別首先,先介紹一下CentOS7的鏡像,本文中,我們使用的是CentOS7.2的鏡像CentOS7的下載地址可以從以下這個地址下載http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1708.i
thinkPHP3.2和TP3.1有什麼區別?
3.2版本在此前的3.1.3版本之上,引入了名稱空間,強化了驅動化和行為,增強了模組化的概念和對雲平臺的支援,並改進了諸多的細節。 主要改進包括: 模組化架構的全新設計 全新名稱空間和自動匯入機制 改進的路由功能 主題的動態切換支援 更強大的Action引數繫結
Java開發中Session和Cookie都有哪些區別?
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.0和HTTP1.1的區別
project med -s 允許 它的 頁面 報告 實體 host 區別一、HTTP 1.0只支持短連接而HTTP 1.1支持持久連接 HTTP 1.0規定瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器完成請求處理後立即斷開TCP
centos 6和centos 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.0和HTTP/1.1的區別&HTTP怎麼處理長連線
1.HTTP簡介 web瀏覽器和伺服器之類的互動過程必須遵守的協議.他是tcp/ip中的一個應用協議。用來協議資料交換過程和資料本身的格式.主要的有HTTP/1.0和HTTP1.1. HTTP/1.0和HTTP/1.1都把TCP作為底層的傳輸協議。 HTTP客戶首先
springCloud和dubbo有哪些區別?
原 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