javascript
Spring 2.0.1 与 BEA WebLogic Server 9.2 的集成
http://www.oracle.com/technetwork/cn/topics/entarch/spring-2-weblogic-server-9-integrat-091510-zhs.html
Spring 2.0.1 與 BEA WebLogic Server 9.2 的集成
作者:Andy Piper、Eric Hsiao、Rod Johnson 和 Chris Wall
04/23/2007
編輯注:Spring 2.0.2 工具包于本文完成后已經發布了,現在可供下載。
摘要
一年多以前,我們講述過 Spring 1.2.x 與 WebLogic Server 9.2 的集成。其后,我們又驗證了 Spring 和 BEA WebLogic Server 的更新的版本,一直到 WebLogic Server 9.2 和 Spring 2.0 的組合。表現出在功能性、可用性和性能上的重大飛躍,因此我們決定對文章進行更新以反映這一變化。
BEA WebLogic Server 9.2 是 Sun Microsystems 的 Java EE 1.4 平臺的領先實現。然而,WebLogic Server 的核心價值主張則體現在 Java EE 規范沒有覆蓋的領域 — 增強的管理、易用性、高可用性、可伸縮性、可靠性和性能。實際上,WebLogic Server 的價值不依賴于任何特定的編程模型,所以它也自然適用于新出現的非 Java EE 的 Java 編程模型。近年來出現的最令人激動的事物莫過于基于控制反轉 (IoC) 的模型,Spring Framework 就是它 事實上的 實現。本文介紹了 Spring 2.0 Framework、WebLogic Server 以及這兩者的集成的新特性。我們會看到,整體大于部分之和。
文章結構
文章的前兩節概述 Spring 和 WebLogic Server 以及它們各自的特性。如果您熟悉 Spring Framework,那么可以跳過第一節。如果您熟悉 WebLogic Server,那么可以跳過第二節。本文主要目的是介紹這兩種技術的集成,所以本文后續的部分都是講述這一主題的。首先,我們分析 MedRec — WebLogic Server 上的一個示例程序 — 分別以它的原始的 Java EE 形式和使用 Spring Framework 重構后的形式。之后,是關于特定的集成點的一些細節。在 WebLogic Server 上開發 Spring 應用程序,那么,幾乎可以肯定,這些細節會對您有所幫助。如果您只是想有個大致的概念,可以先閱讀標題,內容留待以后再看。最后,我們展望了一些正在考慮中的未來開發工作。
Spring 簡介
在本節中,我們將簡要地概述 Spring Framework 的特性,包括 2.0 版以來的一些新特性。
Spring 是基于 Rod Johnson 在 Expert One-on-One J2EE Design and Development(Wrox,2002)公布的代碼的一個分層的Java/Java EE 應用程序框架。Spring 的存在是因為我們相信 Java EE 應該更容易使用,并且有可能創造更簡單的 Java EE 開發方法而不會犧牲平臺性能。
Spring 支持靈活的 Java EE 開發,允許使用傳統 Java 對象(一般稱為 POJO)開發 Java EE 應用程序。
改進的 Spring 開發體驗
Spring 在其核心部分提供了一個易于配置、XML 驅動的控制反轉 (IoC) 容器。IoC 基于所謂的“好萊塢”原則:“不要打電話過來,請等通知。” 在該模式中,通過容器而不是直接編程將 Java 對象間的關系 注入 應用程序中。有兩種注入方式 — 構造函數注入和 setter 注入,具體取決于容器是通過其構造函數還是 mutator 方法將信息注入已創建的 Java 對象。
在 Spring 中,注入的屬性 — 或到其他 bean 的引用 — 是通過一個 XML 文件進行配置的,這使得配置輕而易舉。它耦合了另外一個 AOP 框架,允許非侵入性增加諸如事務處理和安全等屬性,這意味著開發人員可以專注于創建業務解決方案,而不必忙于復雜的 Java EE 開發或配置。由于容器是非侵入性的,所以您不必擔心業務代碼會被特定于供應商(此處也包括 Spring)的構件所污染。
Spring 應用程序組件
如上所述,Spring 提供了一個輕型容器,用于提供集中式、自動化的配置并連接應用程序對象。該容器是 非侵入性的,能夠以一致、透明的方式通過 IoC 將一組松耦合的組件 (POJO) 組裝成復雜的系統。 因為該容器允許首先獨立地開發和測試各軟件組件,然后在任意環境(Java SE 或 Java EE)中進行擴展部署,所以它具有靈活性和高利用率,并提高了應用程序的可測試性和可伸縮性 此外,Spring 提供了許多其他對開發人員友好的特性,下面我們一一列舉:
-
用于事務管理的通用抽象層:支持可插入的事務管理器,使事務劃分更輕松,同時無需處理底層的問題。該層中還包括 JTA 策略和一個 JDBC DataSource。相比普通的 JTA 或 EJB CMT,Spring 的事務支持不依賴于 Java EE 環境。考慮到是一個十分靈活的非侵入性解決方案,事務語義通過 AOP 應用于 POJO,通過 XML 或 Java SE 5 注釋進行配置。
-
JDBC 抽象層:提供了一個有意義的異常層次結構(不再從 SQLException 抽取供應商代碼),簡化了錯誤處理,極大地減少了代碼編寫量。無需為了再次使用 JDBC 編寫另外的 finally 代碼塊。面向 JDBC 的異常遵循 Spring 的一般 DAO 異常層次結構。
-
與業界領先的對象關系映射解決方案的集成:在資源擁有者、DAO 實現支持和事務策略方面。 對大量 IoC 便利特性的一流支持,解決了許多典型的 O-R 映射集成問題。所有這些都遵循 Spring 的一般事務和 DAO 異常層次結構。而且,Spring 2.0 提供了與 Java 持久性 API (JPA) 的完全集成。
-
AOP 功能:完全集成到 Spring 配置管理中。您可以對 Spring 所管理的任何對象啟用 AOP,增加了聲明性事務管理等方面。 借助于 Spring,您能夠擁有沒有 EJB 的聲明性事務管理 — 甚至也可以沒有 JTA。
-
靈活的 MVC Web 應用程序框架:構建在核心的 Sping 功能之上。該框架是通過策略接口高度可配置的,并且適用于多種視圖技術,如 JSP、Velocity、Tiles、iText 和 POI。注意,Spring 中間層可以輕松地與基于任何其他 Web MVC 框架(如 Struts、WebWork 或 Tapestry)的 Web 層組合。
-
用戶可擴展的配置層:允許用戶在 vanilla Spring 配置中加入自己定制的 XML 標記。整個 Spring 2.0 核心庫已經廣泛地使用此功能,以提供增強的語法和通用 Spring 特性的可用性。
-
異步編程抽象:包括與 JMS 提供者的進行框架無關的事務集成的消息驅動的 POJO (MDP);與異步調度機制的集成,如 commonj、Java SE 并行程序和 Quartz;本地事件支持。
所有的 Spring 功能都可以在任何 Java EE 服務器上使用,大部分功能可以在非托管環境中使用。Spring 的一個重心是支持可重用業務和不依賴于特定的 Java EE 服務的數據訪問對象。這些對象可以不費事地跨 Java EE 環境(Web 或 EJB)、獨立應用程序和測試環境進行重用。
Spring 的分層體系結構提供了大量靈活性。 其所有功能都構建在較低的層次上。例如,您可以在不使用 MVC 框架或沒有 AOP 支持的情況下使用 JavaBeans 配置管理。但是,如果您要使用 Web MVC 框架或 AOP 支持,您會發現它們構建在配置框架之上,所以您可以馬上應用有關它的知識。
BEA WebLogic Server 9.2 簡介
在本節,我們將簡要概述 BEA WebLogic Server 的特性,重點強調其提供的底層基礎架構,而不是編程模型。
WebLogic Server 是可伸縮的企業級 Java EE 應用服務器。WebLogic Server 基礎架構支持各類分布式應用程序的部署,是構建各種應用程序的理想基礎。
Sun Microsystem 公司的 Java EE 1.4 規范在 WebLogic Server 上的實現提供了一組標準的 API,用以創建能夠訪問多種服務(如數據庫、消息傳遞服務和外部企業系統連接)的分布式 Java 應用程序。終端用戶客戶程序使用 Web 瀏覽器客戶端或 Java 客戶端訪問這些應用程序。由于 Java EE 是如此有名,這里我們就不進一步討論了。參見關于編程模型的 WebLogic Server 文檔,可以獲得更多信息。
除了實現 Java EE 之外,WebLogic Server 還使企業能夠在一個健壯的、安全的、高可用的、可伸縮的環境中部署任務關鍵型應用程序。這些特性允許企業配置 WebLogic Server 實例集群以分布負載,并在發生硬件或其他故障時提供額外的容量。新的診斷工具允許系統管理員監視和調優已部署的應用程序和 WebLogic Server 環境本身的性能。您還可以對 WebLogic Server 進行配置以自動監視和調整應用程序吞吐量,無需人工干預。廣泛的安全特性保護了對服務的訪問,保證了企業數據安全,并阻止了惡意攻擊。
WebLogic Server 增強的服務質量
與許多其他 BEA 產品一樣,WebLogic Server 如同冰山,浮在水面上的只是很少的一部分而已。具體來說,WebLogic Server 提供了許多特性和工具來支持高可用、可伸縮的應用程序部署:
-
WebLogic Server 集群通過將工作負載分布到多個 WebLogic Server 實例之間,為您的應用程序提供可伸縮性和可靠性。基于要處理的工作量,傳入的請求可以路由到集群中的一個 WebLogic Server 實例。如果出現硬件或其他故障,會話狀態對其他可恢復故障節點工作的集群節點可用。此外,可以實現集群,使服務駐留在這樣的單臺計算機上:如果出現故障,該計算機可以選擇將服務遷移到集群中的另一個節點上。
-
除了在一個集群內跨服務器復制 HTTP 會話狀態之外,WebLogic Server 還能夠跨多個集群復制 HTTP 會話狀態,從而在多個地理區域、電網和 Internet 服務提供商中擴展可用性和容錯能力。
-
Work Manager 基于您定義的規則劃分工作優先級,并監視實際的運行時性能統計信息。然后利用這些信息優化應用程序的性能。Work Manager 可以全局應用于一個 WebLogic Server 域或者一個特定的應用程序組件。
-
過載保護使 WebLogic Server 能夠檢測和避免過載情況,并從中得以恢復正常。
-
網絡通道基于流量類型將網絡流量分散到各個通道中,有利于網絡資源的有效使用。
-
WebLogic Server 持久存儲 是一個性能卓越的內置存儲器解決方案,針對需要持久存儲的 WebLogic Server 子系統和服務。例如,它可以存儲持久的 JMS 消息,或者臨時存儲使用存儲-轉發特性發送的消息。持久存儲支持到基于文件的存儲器或到支持 JDBC 的數據庫的持久性。
-
存儲-轉發服務使 WebLogic Server 可以在跨 WebLogic Server 實例分布的應用程序之間可靠地傳遞消息。如果發送消息時由于網絡或系統故障造成消息目標不可用,那么一個本地服務器實例將保存消息,并且當遠程目標可用時轉發。
-
企業級就緒部署工具使應用程序簡化了從開發階段到生產環境的部署和移植。
-
生產環境重新部署使企業能夠在不中斷舊版程序工作進程的情況下部署新版本。
?
現在,讓我們來看看這兩個系統之間的協作。
在 Java EE 和 Spring 中開發應用程序
為了比較和對照 Java EE 和 Spring 開發方法的差別,我們使用 Spring 2.0 Framework 重新編寫了 MedRec 示例程序,充分利用了 Spring 2.0 的許多創新特性。在下一節,我們將簡要介紹 MedRec 的總體體系結構,然后依次了解它的 Java EE 形式和 Spring 形式。
Medical Records 應用程序
Avitek Medical Records(或 MedRec)是一個 WebLogic Server 示例程序套件,簡明演示了 Java EE 平臺的各個方面。MedRec 旨在作為各層次 Java EE 開發人員的一個培訓工具。它顯示了每個 Java EE 組件的使用方法,闡明了適于組件交互和客戶端開發的設計模式。MedRec 還闡釋了使用 WebLogic Server 開發和部署應用程序的最佳實踐。
MedRec 背后的真實概念是一個框架,其中患者、醫生、管理人員使用各種不同的客戶端管理患者數據。對于患者,MedRec 提供基于 Web 的應用程序,供他們查看自己的醫療記錄和維護檔案文件。MedRec 為管理人員提供基于 Web 的應用程序,用于管理入院登記、醫療記錄上載和常規應用程序監視。MedRec 還提供與獨立醫療機構接合的資源。為了演示這個通信系統,MedRec 包括一個醫生應用程序,用于向 MedRec 系統請求和提供數據。
Java EE 版的 MedRec 體系結構概述
Java EE 和 WebLogic Server 版的 MedRec 的設計和實現采用傳統的三層體系結構模型,分為相互獨立的客戶端、服務器和數據存儲三個部分:
-
表示層:該層負責所有用戶交互;有時也稱作客戶端層。
-
服務層:該層是封裝了應用程序業務邏輯的中間層。服務層處理來自異構客戶端的請求,同時與各種后端系統進行交互,包括數據存儲。該層有時也稱作服務器層。
-
企業信息系統 (EIS) 層:該層表示那些提供和/或存儲原有應用程序和數據庫之類數據的系統。EIS 層有時也稱作數據存儲。
我們為 MedRec 的患者和管理部門程序開發了 Web 應用程序 (webapp) 以公開針對各自用戶的服務。webapp 遵循模型-視圖-控制器模式,Java Server Pages 將視圖呈現給用戶,模型封裝要呈現給用戶和從用戶處捕獲的數據,而控制器機制則管理除與服務層交互之外的組件交互。MedRec 采用 Jakarta Struts 實現該模式。
服務層為發出請求的客戶端提供服務,并管理與后端應用程序和資源的交互。 MedRec 的服務層采用會話外觀模式封裝業務邏輯和業務數據。會話外觀通過提供一個到分布式服務的接口,簡化了應用程序的復雜性。在 MedRec 中,會話外觀的首要責任是提供數據吞吐量。在 MedRec 的 Java EE 和 WebLogic Server 版本中,會話外觀被開發為無狀態的會話企業 JavaBeans,而數據則由實體企業 JavaBeans 管理。
為了與外部實體接合,MedRec 通過 Web 服務公開應用程序功能,從而允許在不同系統之間使用一系列開放標準進行動態交互。通過 Web 服務公開服務,MedRec 可以為獨立的各方提供數據或接收來自各方的數據,這樣就實現了集中式醫療記錄管理的主要目標。
圖 1 闡釋了 Java EE 和 WebLogic 版 MedRec 的高級體系結構圖。
圖 1:J2EE 版 MedRec 的體系結構圖
使用 Spring 重新表示 MedRec
為了使 Spring 能夠利用 WebLogic Server 的企業特性,對 MedRec 的體系結構進行了重新設計,用相應的 Spring 組件替換了核心的 Java EE 組件。我們用基于 Spring 的 MedRec 版本 (MedRec-Spring) 復制了與原版 MedRec 相同的功能。
控制反轉
MedRec-Spring 最顯著的變化是引入了 Spring IoC。IoC 方法功能強大,通過一個容器將相關性注入到配置好的組件中而應用。 IoC 將應用程序代碼與其配置相分離。例如,對象與其相關性無關,因此可以專注于其職責。在 MedRec-Spring 案例中,諸如數據源、JMS 服務、MBean 連接和對等服務等企業資源在運行時被提供給 MedRec-Spring 的對象。另外,通過遷移資源配置和在已編譯代碼外進行引用,應用程序從特定于開發的資源向中間的生產資源和環境的轉移更加易于管理。
我們發現,要正確使用 IoC,應用程序代碼需要遵循更嚴格的 Java 編程規則 — 特別是在編寫接口的代碼時。接口比其他東西更能促進更好的協作,因為可以減輕依賴性,而且實現的變化被隔離開來。 從 IoC 的角度看,接口支持相關性注入的可插入本性。為了利用 IoC,我們對 MedRec-Spring 進行了重構,這樣就可以基于接口對業務對象進行編碼。
POJO
在 MedRec-Spring 中,傳統 Java 對象 (POJO) 代替了無狀態會話 EJB。無狀態會話 EJB 的強大在于它們的遠程控制和事務管理功能。 因為 MedRec-Spring 通過 Spring 的 HTTP Invoker 體系結構公開了服務 bean,所以它能夠滿足遠程控制的要求。 事務管理是由 Spring 的事務抽象層提供的。MedRec-Spring 的事務管理精確地鏡像了 MedRec 的事務管理,因為 Spring 事務管理器配置為將責任委托給 WebLogic Server 的 JTA 事務管理器。
消息處理
MedRec-Spring 包含原始 MedRec 的大多數消息處理功能。我們采用 Spring 的 JMS 程序包簡化了一些一般性任務,如連接工廠和目標查找。Spring 提供了一個代表消息目標的對象,而不是通過程序獲取隊列句柄。與所有 Spring bean 一樣,這些對象表示(JNDI 名稱、連接工廠關聯等)是在已編譯代碼的外部配置的。 我們還在三個領域使用了 Spring 2.0 的消息驅動的 POJO (MDP) 作為 JMS 消息的目標:
- 處理郵件消息(向患者發送批準郵件或拒絕郵件)
- 處理注冊消息(處理新患者注冊)
- 處理醫療記錄上載(從 XML 文件向 RDBMS 上載醫療記錄)
AOP
MedRec-Spring 使用 Spring AOP 主要有兩個目的:
- 聲明性事務管理
- DAO 實現后處理 (JPA) 的返回值
JPA
MedRec-Spring 現在使用 JPA 訪問和寫入患者記錄。有關更多詳細信息,請參見“結合使用 JAVA 持久性 API 和 SPRING 2.0”。
應用程序管理
MedRec-Spring 包含應用程序管理特性。這些特性與 WebLogic Server 的域配置以及運行時域交互。MedRec-Spring 必須按照 WebLogic Server 的 MBean Server 形式,Spring 提供了連接管理,簡化了 MBean Server 的可訪問性。
Web 服務
最后,MedRec-Spring 使用 Web 服務導出它的服務。 Spring 提供一個 JAX-RPC 工廠用于生成 Web 服務的代理。與其他 Spring bean 類似,工廠 bean 也是在已編譯的代碼外部配置的,使得應用程序更加靈活。
圖 2 顯示基于 Spring 的 MedRec 版本的高級體系結構圖。
圖 2:基于 Spring 的 MedRec 版本的高級體系結構圖
WebLogic Server 上的 Spring 最佳實踐
比較了 Java EE 和 Spring 環境上的 MedRec 體系結構之后,現在我們來介紹在實現 MedRec-Spring 應用程序過程中發現的一些寶貴經驗:
-
使用延遲初始化。為了實現 IoC 容器,Spring 加載一個 應用程序上下文 文件,創建并緩存每個已配置的 bean 實例。Spring bean 引用的每個資源都必須可以實例化或查找,了解這一點很重要。例如,Spring 的 JMX 支持提供到 WebLogic Server 的 MBean 服務器的連接。部署期間,并非所有 MBean 服務器都是激活的,因此在部署資源時,用戶應該一啟動即使用 Spring 延遲初始化和查找服務。
-
基于功能分離出 Spring 配置。 這允許應用程序組件僅加載那些與自身工作職責相關的上下文。該實踐還允許測試人員用一個特定于測試環境的上下文替換一個應用程序上下文(例如,數據源配置),從而改變其行為。
-
通過 JndiObjectFactoryBean 封裝 JDBC 數據源連接池 。則那些要求數據庫交互的 bean 可以引用該 bean,以利用 WebLogic Server 的數據源連接池功能。
-
將 Spring 的 org.springframework.ejb.support 用于會話和消息驅動的企業 JavaBeans 。Spring 的 org.springframework.ejb.support 提供企業 JavaBeans (EJB) 可以擴展的抽象類。這些抽象的 EJB 類通過包含 EJB 生命周期方法的標準實現來輔助開發。更重要的是,這些類提供了加載 Spring 應用程序上下文的機制,包括跨多個 EJB 和客戶端共享上下文,因此在 EJB 初始化時減少了重復和開銷。
-
利用熱部署和 WebLogic Server 的拆分開發目錄環境。 這極大地提升了集成測試期間的 Spring 開發體驗。熱部署允許應用程序重新加載,而無需重新啟動服務器。拆分開發目錄環境減少了不必要的文件復制,加快了開發和部署。拆分開發目錄 Ant 任務幫助您快速地重新編譯和重新部署應用程序,無需先生成一個可部署的存檔文件或展開的存檔目錄。
-
將 Spring 庫打包為應用程序庫、可選的擴展或服務器擴展。這允許幾個 Spring 應用程序共享 Spring Framework,減少了應用程序所占空間。不僅減少了內存占用,而且還提高了部署次數。
Spring on WebLogic Server 工具包
為幫助您從部署在 WebLogic Server 上的 Spring 應用程序得到最大收獲,我們已經發布了一個經過認證的 BEA 發行版,包括 Spring 2.0、MedRec on Spring 應用程序和其他一些不錯的工具。可以從 BEA 的發行版 Web 站點上免費下載此工具包。
?
Spring 2.0.1 與 BEA WebLogic Server 9.2 的集成
頁面: 1, 2, 3, 4
企業 Spring
Spring Framework 的非侵入性 IoC 開發模型不但依賴于 Java EE 應用服務器可用的特性集,而在旨在補充該特性集。事實上,在要求很高的生產環境中,底層應用服務器基礎架構提供的服務質量對 Spring 應用程序的持續可靠性、可用性和性能非常重要。WebLogic Server 9.2 提供了企業級特性,能夠從各方面增強您的 Spring 應用程序。在本節中,我們將詳述這些特性以及如何在 Spring 應用程序中利用它們。
集群管理和部署
一個 WebLogic Server 集群包括多個 WebLogic Server 服務器實例,這些服務器實例同時運行并一起工作,從而提高了可伸縮性和可靠性。對客戶端來說,集群就像單個 WebLogic Server 實例一樣。構成集群的服務器實例既可運行在同一臺計算機上,也可位于不同的計算機上。可以通過在現有的計算機上向集群添加額外的服務器實例,或者向集群添加計算機以托管增加的服務器實例,來提高集群的容量。WebLogic Server 集群為 Spring 應用程序提供了一個企業級部署平臺,WebLogic Server 提供的豐富性和易用性是其他支持相似特性的技術所不具備的。有關 WebLogic Server 集群的配置和管理的完整討論,請參見“Understanding Cluster Configuration”。
通常,Spring 應用程序被打包成 webapp 形式,在這種情況下,您無需為了利用 WebLogic Server 集群而更改自己的應用程序。只需將應用程序部署到集群中的服務器,即可體驗增強的可伸縮性和可用性帶來的好處。
Spring 會話復制
Spring Web 應用程序通常將信息存儲在 HTTP 會話中,如訂單 ID 和用戶信息。為了支持一個集群內的 servlet 和 JSP 的自動復制和故障切換,WebLogic Server 支持集中用于保持 TTP 會話狀態的機制。只需為用戶應用程序提供一個適當的 weblogic.xml 部署描述符,它們就能夠被 Spring Web 應用程序非侵入性地使用。獲取 WebLogic Server 9.0 的提供的有關如何配置各種類型的會話持久性的更多信息。
集群化的 Spring 遠程控制
Spring 提供強大的遠程控制支持,允許您仍然利用一致的基于 POJO 的編程模型輕松地導出和使用遠程服務。通過一個接合到適當 Spring bean 的 RMI 接口,Vanilla Spring 支持代理 POJO 調用。然而,這種支持僅限于 JRMP(Sun 的 RMI 實現),或者通過 JndiRmiProxyFactoryBean 使用特定的遠程接口。借助于 Spring 1.2.5 on WebLogic Server 9.0 認證,我們已經擴展了 JndiRmiProxyFactoryBean 和相關的服務導出程序 — 這樣它就能支持任何 J2EE RMI 實現的 POJO 代理,包括 RMI-IIOP 和 T3。這方面的支持還包括一個 WebLogic RMI 部署描述符,它支持代理 RMI 接口上的集群化,因此 POJO 調用可以在一個 WebLogic Server 集群內進行負載均衡。客戶端上這種支持的配置與此相似 ( applicationContext.xml):
<bean id="proProxy"class="org.springframework.remoting.rmi.JndiRmiProxyFactoryBean"><property name="jndiName" value="t3://${serverName}:${rmiPort}/order"/></property><property name="jndiEnvironment"><props><prop key="java.naming.factory.url.pkgs"> weblogic.jndi.factories</prop></props></property><property name="serviceInterface"value="org.springframework.samples.jpetstore.domain.logic.OrderService"/></bean>服務導出程序如下(同樣來自 applicationContext.xml):
<bean id="order-pro" class="org.springframework.remoting.rmi.JndiRmiServiceExporter"><property name="service" ref="petStore"/><property name="serviceInterface"value="org.springframework.samples.jpetstore.domain.logic.OrderService"/><property name="jndiName" value="order"/></bean>集群化的描述符自動包含在其中,僅要求適當的集群配置以及在所有集群成員上部署 Spring 應用程序。獲得有關故障切換支持的更多信息。
對 Spring 組件的控制臺支持
Spring on WebLogic Server 工具包是一個 WebLogic Server 控制臺擴展,它顯示了應用程序中定義的 Spring bean、屬性和操作。它構建在 WebLogic 控制臺擴展門戶框架之上,該框架可以轉換 WebLogic Administration 控制臺的外觀、功能和布局,而無需修改服務器或控制臺代碼。將控制臺擴展復制到 yourdomain/console-ext 目錄后即進行了部署,隨后服務器重新啟動。有關部署控制臺擴展的更多詳細信息,請參考 Spring on WebLogic Server 工具包。
控制臺擴展為不是 MBean 的 Spring bean 自動創建 (JMX) 管理接口(對于多數 Spring bean,通常就是這樣),通過在 applicationContext.xml 中配置一個 MBeanExporter 并指定經匯編程序公開的 bean 來完成。該特性是 Spring 和 WebLogic Server 無縫地、非侵入性協作的一個極好的例證。 為了使 Spring 應用程序支持 JMX,只需更改應用程序上下文部署描述符。為了使控制臺支持 Spring,只需要將兩個 jar 部署到現有域即可。
為了在 WebLogic Server 的 Administration 控制臺啟用 Spring Console 擴展,需要兩個 jar 文件;它們作為 Spring WebLogic 程序包的一部分提供。具體來說,這兩個所需的 jar 文件稱為 spring-ext-server.jar 和 spring-ext-client.jar。 spring-ext-server.jar 需要復制到 yourdomain/console-ext 目錄。相關的 spring-ext-client.jar 文件需要和 Web 應用程序一道部署。(如果是 .WAR 文件,則將 spring-ext-client.jar 放入 Web 應用程序的 WEB-INF/lib 目錄。)
有了這兩個文件后,剩下的工作就是在 Spring XML 配置文件中定義幾個 bean。第一個絕對要定義的 Spring bean 是 com.interface21.wl9.jmx.mediator.Mediator bean。這個 bean(顧名思義)介于用戶應用程序、WebLogic Server 的 MBeanServer 和管理控制臺三者之間。它的定義如以下示例所示,是個非常簡單的 bean:
<!-- WLS console adapter bean --><bean id="consoleAdapter" class="com.interface21.wl9.jmx.mediator.Mediator"/>這個 bean 必須被“插入”(或說相關性注入)第二個 bean 中,即 MBeanExporter,它也是絕對必須進行配置的。 MBeanExporter 類交付的成果就是只需將 Spring 應用程序上下文中已定義的任意數量的不同 bean 導出到 BEA WebLogic MBeanServer(或者任何配置好的 MBeanServer)。注意,MBeanServer 導出的那些 bean 無需為 JMX 進行編碼。Spring JMX 基礎架構代碼負責生成 ModelMBean 來描述通過 JMX 為了進行管理而導出的 bean。下面是一個典型的上下文配置文件的 MBeanExporter bean 定義:
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"><property name="assembler" ref="assembler"/><property name="server" ref="server"/><property name="beans"><map><!-- these are the beans that are to be exported... --><entry key="my_app_name:type=MaintenanceControl" value-ref="maintenanceInterceptor"/><entry key="my_app_name:type=ExceptionMonitor" value-ref="exceptionHandler"/><entry key="my_app_name:type=RequestStatistics" value-ref="requestStatisticsFilter"/></map></property><property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING"/><property name="autodetect" value="true"/><property name="listeners"><list><!-- notice how we 'plug-in' the Mediator beanthat was defined previously... --><ref bean="consoleAdapter"/></list></property></bean>注意上面的 bean 定義,另一個 bean(“assembler”)被注入到 MBeanExporter 的“assembler”屬性中。下面是該 bean 的定義:
<bean id="assembler" class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler"><property name="interfaceMappings"><props><prop key="my_app_name:type=MaintenanceControl">fully.qualified.management.interface.name</prop><prop key="my_app_name:type=ExceptionMonitor">fully.qualified.management.interface.name</prop><prop key="my_app_name:type=RequestStatistics">fully.qualified.management.interface.name</prop></props></property></bean>描述 Spring JMX 提供的所有內容不在本文的討論范圍內。此處只需說明一點就夠了,那就是上面定義的 InterfaceBasedMBeanInfoAssembler bean 是一個可能的策略,用以控制用戶 bean 的哪些方法和屬性實際地公開出來供管理之用,就像 JMX 操作和屬性那樣。 InterfaceBasedMBeanInfoAssembler 使用(任意地)接口決定導出哪些方法和屬性。有關更多信息,請參閱本文末尾的“參考資料”一節。
MBeanExporter 的 bean 定義上的第二個著名屬性是 server 屬性。 這是向 MBeanExporter 注入一個 WebLogic Server 的 MBeanServer 實例的地方。MBeanExporter 將所有已配置的 bean 導出到這一特定的服務器。該 bean 的定義如下所示:
<!-- WebLogic 9 MBeanServer --><jndi:jndi-lookup id="server" jndi-name="java:comp/env/jmx/runtime"/>在 server bean 的這個定義中,實際上 MBeanServer 實例源自 JNDI(使用為 jndiName 屬性指定的值在上下文中查找)。對于 MBeanExporter,MBeanServer 源自 JNDI 的事實沒有意義;這個將相關性注入需要相關性的對象透明源引是相關性注入方法的一大附加值(上面所見的易于使用和配置的 JndiObjectFactoryBean 證明 Spring 的注入支持是非常高級的)。
最后,最有趣的是 MBeanExporter 配置的一部分是 beans 屬性。 beans 屬性是 (JMX) ObjectName 到 bean 的簡單映射,這些 bean 將導出到先前注入的 MBeanServer 實例以便管理。選擇 ObjectName 的策略(在這種策略下,您的 bean 實際上會導出到 MBeanServer)是完全可配置的。在本例中,所用的默認策略是只需使用 beans 映射的鍵作為 ObjectName。(有關各種 ObjectName 策略的全面綱要,請參見隨 Spring 一起提供的 JavaDoc。)
Web 服務支持
Spring 的遠程控制功能的另一個方面是它對 RPC 風格的 Web 服務的支持。WebLogic Server 提供了基于 Ant 的工具,可以根據 Web 服務的描述生成 JAX-RPC 存根。Web 服務客戶端使用這些生成的存根獲取一個表示服務器端操作的遠程接口。Spring 通過提供一個 JaxRpcPortProxyFactoryBean 簡化了這個過程。
我們發現,在 WebLogic Server 環境中正確地配置 JaxRpcPortProxyFactoryBean 有些棘手,所以為了節約您的時間,我們給出下面這個代碼片段,演示如何為一個包含復雜類型的文檔字面包裝的 Web 服務配置代理生成。
多數屬性是自解釋的。有幾個屬性比較有名:
-
serviceInterface 是 Spring setter 注入的副產品。這個類將表示 Web 服務操作。
-
customProperties 屬性支持定制的 WebLogic Server Web 服務存根屬性。
-
jaxRpcService 值設置為 WebLogic Server 的生成的 JAX-RPC 實現服務。JAX-RPC 服務負責驗證 Web 服務和加載復雜類型映射。為了實現后者,WebLogic Server 的 JAX-RPC 實現服務必須配置為一個 Spring bean。這可以確保 JAX-RPC 服務構造函數的運行,而且類型映射文件也在此加載。
在 JaxRpcPortProxyFactoryBean 上將 lookupServiceOnStartup 設置為 false,即可在啟動時關閉 JAX-RPC 服務查找。當首次訪問時,將會進行查找。這對于與可靠的 WebLogic Server 請求/響應 Web 服務通信是必需的,而此處的客戶端也必須是一個 Web 服務。在這些情況下,始發客戶端通常是與 Web 服務客戶端一起部署的。 因為應用程序部署完成前不會激活 Web 服務,所以客戶端 Web 服務對于 Spring 上下文加載是不可用的。如下代碼摘自一個 applicationContext-ws.xml 上下文配置文件:
<!-- reliable asynchronous Web service for sending new medical records to medrec --><bean id="reliableClientWebServicesPortType"class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean"lazy-init="true"><property name="wsdlDocumentUrl"value="http://${WS_HOST}:${WS_PORT}/ws_phys/PhysicianWebServices?WSDL"/><property name="portName" value="PhysicianWebServicesPort"/><property name="jaxRpcService"><ref bean="generatedReliableService"/></property><property name="serviceInterface"value="com.bea.physician.webservices.client.PhysicianWebServicesPortType"/><property name="username" value="medrec_webservice_user"/><property name="password" value="weblogic"/><property name="customProperties"><props><prop key="weblogic.wsee.complex">true</prop></props></property></bean><!-- allows the jaxRpcService class to execute its constructor which loads in type mappings --><bean id="generatedReliableService"class="com.bea.physician.webservices.client.PhysicianWebServices_Impl"></bean>有關更多信息,請參見 WebLogic Server 的 Overview Web Services Invocation 和 Remoting and Web Services Using Spring。
?
安全性
WebLogic Server 安全系統支持并擴展了 Java EE 的安全性,同時提供了一組豐富的安全提供程序,可以對其進行定制以處理不同的安全性數據庫或安全性策略。除了使用標準的 Java EE 安全性之外,應用程序編程人員還可以使用很多專有擴展,這些擴展使應用程序可以與安全系統緊密集成。 WebLogic Server 附帶了幾個安全提供程序,例如,可以選擇包含大部分流行 LDAP 服務器的身份驗證數據庫、Active Directory、本地 Windows 和內置的身份驗證解決方案。可以使用定制的提供程序對內置的提供程序進行擴充,從而幾乎可以與任意身份驗證數據庫、授權機制和憑證映射服務相集成。由于部署為 webapp 的 Spring 應用程序使用的是 Java EE 安全性,因此無需修改應用程序即可獲得 WebLogic Server 的安全性優點。
經驗豐富的 Spring 用戶還會熟悉 Acegi — Spring 自身的安全框架。目前,可以在應用程序中使用 Acegi、WebLogic Server 安全性或同時使用二者,因為它們是相互獨立的。 稍后我們將講述與此相關的更多信息。
分布式事務
Spring 提供事務管理的基礎架構。除了對各家數據庫供應商的支持之外,Spring 還通過一家 Java EE 供應商的 JTA 實現支持分布式事務。通過 WebLogicJtaTransactionManager,可以將 Spring 的 JTA 管理器配置為與 WebLogic Server 的 JTA 實現一起工作。
WebLogicJtaTransactionManager 直接向 WebLogic Server 的 Java Transaction API 委托責任。通過 JNDI,客戶端和 bean 提供程序可以使用 WebLogic Server JTA TransactionManager 接口,這一交互由 Spring 管理。事務管理器也支持事務的作用域;事務能夠作用于集群和域的內部或二者之間。
WebLogicJtaTransactionManager 最強大的特性是管理分布式事務的能力和用于企業應用程序的兩階段委托協議。使用 WebLogicJtaTransactionManager,應用程序能夠利用 WebLogic Administration Console 來進行事務監控。 WebLogicJtaTransactionManager 還支持按數據庫隔離級別,允許復雜的事務處理配置。下面的代碼節選自 applicationContext-service.xml:
<bean id="serviceFacade" class="com.bea.medrec.web.service.ServiceFacadeImpl"><!-- .... --></bean><!-- spring's transaction manager delegates to WebLogic Server's transaction manager --><bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"> <property name="transactionManagerName" value="javax.transaction.TransactionManager"/></bean><aop:config><aop:advisor advice-ref="txAdvice"pointcut="execution(* com.bea.medrec.web.service.ServiceFacade.*(..))"/></aop:config><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="activate*" propagation="REQUIRED"/><tx:method name="deny*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="process*" propagation="REQUIRED"/><tx:method name="get*" propagation="REQUIRED" read-only="true"/><tx:method name="search*" propagation="REQUIRED" read-only="true"/><tx:method name="saveRecord" propagation="REQUIRED"/><!-- ... --></tx:attributes></tx:advice>有關更多信息,請參見 Overview of Transactions in WebLogic Server Applications 和“在 Spring 中實現事務掛起”。
消息驅動的 POJO
消息驅動的 POJO (MDP) 替代了 Java EE 的消息驅動的 Bean (MDB)。與 POJO 類似,它們的優勢也是不要求任何特定于平臺的 API 擴展或結構。它們只需要標準的 JMS API 實現:
public class RegistrationMessageListener implements MessageListener {public void onMessage(Message message) {// Fetch Registration information from ObjectMessage.// Process new reg by invoking service (DI)// ... }}與 Spring 的大多數成員一樣,MDP 容器的配置當然也很簡單。下面的代碼節選自 applicationContext-jms.xml:
<!-- JMS ConnectionFactory and Queue --><jndi:jndi-lookup id="jmsConnectionFactory" jndi-name="com.bea.medrec.messaging.MedRecQueueConnectionFactory"/><jndi:jndi-lookup id="registrationQueue" jndi-name="com.bea.medrec.messaging.RegistrationQueue"/><!-- MDP --><bean id="registrationMessageListener" class="com.bea.medrec.service.messaging.RegistrationMessageListener"><!-- ... properties... --></bean><!-- MDP container --><bean id="registrationMessageListenerContainer"class="org.springframework.jms.listener.DefaultMessageListenerContainer"><property name="connectionFactory" ref="jmsConnectionFactory"/><property name="concurrentConsumers" value="5"/><property name="destination" ref="registrationQueue"/><property name="messageListener" ref="registrationMessageListener"/><property name="transactionManager" ref="transactionManager"/></bean>有關在 WebLogic Server 上如何實現 MDP 的更詳細的討論,請參見這里。
JPA 和 AOP 配置
我們已經定義了一個 Web 服務層,它允許我們在 RMI、Spring HTTP 調用程序、Hessian/Burlap 和 JAXPRC 之間輕松切換 Web 服務實現。調用遠程服務時,如果想要使用一種可序列化的機制傳遞對象,那么這些對象本身必須可序列化。遺憾的是,OpenJPA 的 Find 結果是一個私有的列表實現,不支持 Serializable,所以我們需要將這些列表與一些更合適的列表綁定,如 Java SE 集合庫的 ArrayList 或 LinkedList。我們可以使用 spring aop 來幫助我們實現,而不必修改應用程序源代碼:
@Aspectpublic class ReturningValuePostProcessorAspect {@Pointcut("execution(java.util.List com.bea.medrec.dao.PatientDao.*(..))")public void postProcessPatientDao() {}@Pointcut("execution(java.util.List com.bea.medrec.dao.RecordDao.*(..))")public void postProcessRecordDao() {}@Pointcut("execution(java.util.List com.bea.medrec.dao.UserDao.*(..))")public void postProcessUserDao() {}}以下是相關聯的 ReturningValuePostProcessor 類。
@Aspectpublic class ReturningValuePostProcessor {public ReturningValuePostProcessor() {}@Around("com.bea.medrec.dao.jpa.ReturningValuePostProcessorAspect.postProcessPatientDao()")public Object postProcessPatientDao(ProceedingJoinPoint pjp) throws Throwable {return doPostProcess(pjp);}@Around("com.bea.medrec.dao.jpa.ReturningValuePostProcessorAspect.postProcessRecordDao()")public Object postProcessRecordDao(ProceedingJoinPoint pjp) throws Throwable {return doPostProcess(pjp);}@Around("com.bea.medrec.dao.jpa.ReturningValuePostProcessorAspect.postProcessUserDao()")public Object postProcessUserDao(ProceedingJoinPoint pjp) throws Throwable {return doPostProcess(pjp);}private Object doPostProcess(ProceedingJoinPoint pjp) throws Throwable {Object retVal = pjp.proceed();if (retVal == null) {return null;}if (!(retVal instanceof List)) {return retVal;} else {//noinspection uncheckedreturn new ArrayList((List) retVal);}}}下面的代碼節選自 applicationContext-jpa.xml:
<bean id="patientDao" class="com.bea.medrec.dao.jpa.PatientDaoImpl"/><bean id="recordDao" class="com.bea.medrec.dao.jpa.RecordDaoImpl"/><!-- ... --><bean id="returningValuePostProcessor" class="com.bea.medrec.dao.jpa.ReturningValuePostProcessor"/><aop:aspectj-autoproxy/>Java 管理擴展
Java 管理擴展 (JMX) 是用于監視和管理 Java 應用程序的規范。它允許一般的管理系統監視應用程序,當應用程序需要注意時發出通知,并修改應用程序狀態以補救問題。Spring 提供廣泛的 JMX 支持,包括通過 Spring 的 MBeanServerConnectionFactoryBean 公開 WebLogic Server 的 MBeanServer 的能力。 MBeanServerConnectionFactoryBean 是一個方便的工廠,附帶一個 MBeanServerConnection。 在應用程序部署期間,建立連接并進行緩存,供以后引用 bean 進行操作。
可以將 MBeanServerConnectionFactoryBean 配置為返回 WebLogic Server 的 Runtime MBean Server,公開特定的 WebLogic Server 實例的監視、運行時控制和活動配置。這包括訪問 WebLogic Server Diagnostics Framework。 此外,Runtime MBean 為當前服務器提供 runtime MBean 和活動配置 MBean 的訪問。
還可以配置 MBeanServerConnectionFactoryBean 以獲得到 WebLogic Server 的Domain Runtime MBean Server 的連接。Domain Runtime MBean Server 提供域范圍內服務的訪問,如應用程序部署、JMS 服務器和 JDBC 數據源。它還是訪問域中所有服務器的所有 runtime MBean 和活動配置 MBean 的層次結構的單點。這個 MBean Server 也是訪問被管理服務器上的 MBean 的單點。
此外,可以配置 MBeanServerConnectionFactoryBean 以獲取與 WebLogic Server 的 Edit MBean Server 的連接。Edit MBean Server 提供管理當前 WebLogic Server 域配置的入口點。
注意,在部署期間,WebLogic Server 的 Domain Runtime MBean Server 不是活動的。所以,bean 需要使用 Spring 的延遲初始化進行配置,它會在調用 bean 時獲取該 bean。
下面是使用 WebLogic 的 MBean Server 配置 Spring 的 MBeanServerConnectionFactoryBean 連接的一個例子:
<!-- expose WebLogic Server's runtime mbeanserver connection --><bean id="runtimeMbeanServerConnection"class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean"><property name="serviceUrl" value="service:jmx:t3://${WS_HOST}:${WS_PORT}/jndi/weblogic.management.mbeanservers.runtime"/><property name="environment"><props><prop key="java.naming.security.principal">${WS_USERNAME}</prop><prop key="java.naming.security.credentials">${WS_PASSWORD}</prop><prop key="jmx.remote.protocol.provider.pkgs">weblogic.management.remote</prop></props></property></bean>有關更多信息,請參見 Understanding WebLogic Server MBeans 和 Spring 的 JMX Support。
支持
從 WebLogic Server 9.0 和 Spring 1.2.5 開始,BEA 就為 Spring Framework on WebLogic Server 提供了支持和認證。這種支持不僅是測試 WebLogic Server 上的 Spring 庫的健全性,還致力于 BEA 和 Interface 21(Spring Framework 的創建者和維護者)之間的積極努力和協作。我們不但測試了上面所講的 Spring 2.0 的所有特性和配置,一些新特性還直接作為 BEA 和 Interface 21 的協作成果引入 Spring 2.0。
下載
Spring Open Source Framework Support 2.0 下載包括 Spring 2.0(已在 WebLogic Server 9.2 上經過認證)和 Spring-JMX 控制臺擴展以及利用 Spring 2.0 Framework 重新編寫的 WebLogic Medical Records 示例程序。
未來的工作
今后,我們計劃提供 WebLogic Server 和 Spring Framework 之間更深層次的集成。盡管我們有了一些想法,但其中最令人感興趣的是:
-
Spring 部署單元: Spring 應用程序通常被部署為 webapp,但今后為 Spring 應用程序提供專用部署單元是可能的。
-
Spring 安全性和 WebLogic Server 安全性集成: Spring 安全性是 Spring 的安全框架,我們計劃將它與 WebLogic Server 的企業級安全框架集成。
總結
我們用了一些時間討論了 Spring、WebLogic Server 以及這兩種技術的集成。如我們所展示的那樣,WebLogic Server 提高了應用程序的服務質量,Spring 則提高了開發人員的生產力。這兩種技術都是高度非侵入性的,允許您專注于應用程序的業務功能的開發,而不是糾纏于特定于技術的 API 的錯綜復雜性。
總結
以上是生活随笔為你收集整理的Spring 2.0.1 与 BEA WebLogic Server 9.2 的集成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse安装SVN插件方式简明介绍
- 下一篇: gradle idea java ssm