容器(container):指應用代碼的運行框架。應用對象(大多數時候是業務對象)在容器里運行,這也就是我們所說的“被容器管理”,EJB就是過去管理J2EE業務對象時最常用的容器。而J2EE的WEB容器則比較特殊,它是用語管理servlet及其相關依賴對象的。
“對象”表示運行在容器中的對象,一組協作的對象通常被稱為“組件”。舉例:EJB通常被稱為組件(而不是對象)。當一個對象被容器管理起來時,它就多少有些類似一個組件-它擁有了組件最重要特征:可以切換成另一個實現,只要后者滿足同樣的契約(contract)即可。這里的“對象”和粒度無關。
一個“輕量級容器”,應該具有下列特性:可以管理應用代碼,而又不給應用代碼強加對容器的依賴。例如,應該可以無須修改地將遺留代碼引入容器。我們把這種特性叫做“非侵入性”:除非絕對必須,否則基礎設施不應該把對容器的依賴強加給應用代碼。這也使應用對象既可以在容器內,又可以在容器外運行,達到容器無關性。
所有EJB(甚至包括本地的EJB)的粒度都必須相當粗;EJB組件不支持繼承,僅僅允許EJB實現類的繼承。
“企業級應用”的范疇相當寬泛,從只訪問一個數據庫的Web應用,知道高度事務性,以中間件為核心,需要訪問多個資源,甚至可能用到RMI基礎上的內部分布和異步消息機制的應用程序。
Spring是一個應用框架,而不是Web框架、IOC框架,AOP框架或者中間層框架什么的,Spring由多個子框架組成,而且這些框架都相對獨立。Spring 支持對EJB的訪問,使用動態代理技術來實現無須編碼的客戶端業務代表(business delegate)因此,“是否使用本地無狀態Session bean”就完全成了一種實現選擇,而不是架構選擇。也就是說如果你想使用EJB,你可以在統一的架構體系中使用,卻不需要再讓EJB成為你的架構基礎。
AOP最有價值的用途就是在業務方法上提供通用的企業級服務。譬如聲明性事務管理和聲明性安全檢查等。AOP影響的僅僅是我們使用J2EE服務的方式。在它的封裝之下,我們仍然可以使用應用服務器的核心功能,譬如JTA。容器管理事務(CMT)。
如果應用系統在邏輯上分為三層結構:一個WEB層,一個業務對象層,一個數據訪問層,整個應用系統運行在同一個JVM中。在這樣一種分層的架構中,事務管理屬于業務對象層。通常在業務門面中劃分,數據訪問層與事務過程。但是并不是管理事務,在數據訪問層做不同方法調用可以參與到一個事務過程中 。
全局事務管理的底層基礎設施是由容器實現的JTA,而全局事務管理往往使用EJB CMT。EJB CMT只不過是訪問容器事務協調器的一種方式而已。此外,也可以直接使用JTA。
X/Open XA規范:XA定義了事務管理器和資源管理器的底層協議,定義了參與事務的資源的底層協議,以及兩階段提交的其他特殊情況的底層協議。
編程式事務管理:使用JTA通過JNDI獲取;聲明式事務管理:通過使用組件模型(即EJB CMT),這是一種建立在JTA基礎設施之上的高層的服務。
JAVA連接器架構(the java connector architecture):提供了無縫插入容器事務和資源池基礎設施的手段。通過標準的接口,允許任何資源參與全局分布式容器事務。
對于集合查詢和批量更新操作來說,直接使用關系型操作非常合適,關系型數據庫可以非常高效地處理這些操作。
客戶端通常不可能對遠程異常進行有效的處理,因此常見的做法是將其沿著調用棧一直向上拋,由一個通用的基礎模塊來統一處理。