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 工具包于本文完成后已經(jīng)發(fā)布了,現(xiàn)在可供下載。
摘要
一年多以前,我們講述過 Spring 1.2.x 與 WebLogic Server 9.2 的集成。其后,我們又驗(yàn)證了 Spring 和 BEA WebLogic Server 的更新的版本,一直到 WebLogic Server 9.2 和 Spring 2.0 的組合。表現(xiàn)出在功能性、可用性和性能上的重大飛躍,因此我們決定對文章進(jìn)行更新以反映這一變化。
BEA WebLogic Server 9.2 是 Sun Microsystems 的 Java EE 1.4 平臺的領(lǐng)先實(shí)現(xiàn)。然而,WebLogic Server 的核心價值主張則體現(xiàn)在 Java EE 規(guī)范沒有覆蓋的領(lǐng)域 — 增強(qiáng)的管理、易用性、高可用性、可伸縮性、可靠性和性能。實(shí)際上,WebLogic Server 的價值不依賴于任何特定的編程模型,所以它也自然適用于新出現(xiàn)的非 Java EE 的 Java 編程模型。近年來出現(xiàn)的最令人激動的事物莫過于基于控制反轉(zhuǎn) (IoC) 的模型,Spring Framework 就是它 事實(shí)上的 實(shí)現(xiàn)。本文介紹了 Spring 2.0 Framework、WebLogic Server 以及這兩者的集成的新特性。我們會看到,整體大于部分之和。
文章結(jié)構(gòu)
文章的前兩節(jié)概述 Spring 和 WebLogic Server 以及它們各自的特性。如果您熟悉 Spring Framework,那么可以跳過第一節(jié)。如果您熟悉 WebLogic Server,那么可以跳過第二節(jié)。本文主要目的是介紹這兩種技術(shù)的集成,所以本文后續(xù)的部分都是講述這一主題的。首先,我們分析 MedRec — WebLogic Server 上的一個示例程序 — 分別以它的原始的 Java EE 形式和使用 Spring Framework 重構(gòu)后的形式。之后,是關(guān)于特定的集成點(diǎn)的一些細(xì)節(jié)。在 WebLogic Server 上開發(fā) Spring 應(yīng)用程序,那么,幾乎可以肯定,這些細(xì)節(jié)會對您有所幫助。如果您只是想有個大致的概念,可以先閱讀標(biāo)題,內(nèi)容留待以后再看。最后,我們展望了一些正在考慮中的未來開發(fā)工作。
Spring 簡介
在本節(jié)中,我們將簡要地概述 Spring Framework 的特性,包括 2.0 版以來的一些新特性。
Spring 是基于 Rod Johnson 在 Expert One-on-One J2EE Design and Development(Wrox,2002)公布的代碼的一個分層的Java/Java EE 應(yīng)用程序框架。Spring 的存在是因?yàn)槲覀兿嘈?Java EE 應(yīng)該更容易使用,并且有可能創(chuàng)造更簡單的 Java EE 開發(fā)方法而不會犧牲平臺性能。
Spring 支持靈活的 Java EE 開發(fā),允許使用傳統(tǒng) Java 對象(一般稱為 POJO)開發(fā) Java EE 應(yīng)用程序。
改進(jìn)的 Spring 開發(fā)體驗(yàn)
Spring 在其核心部分提供了一個易于配置、XML 驅(qū)動的控制反轉(zhuǎn) (IoC) 容器。IoC 基于所謂的“好萊塢”原則:“不要打電話過來,請等通知。” 在該模式中,通過容器而不是直接編程將 Java 對象間的關(guān)系 注入 應(yīng)用程序中。有兩種注入方式 — 構(gòu)造函數(shù)注入和 setter 注入,具體取決于容器是通過其構(gòu)造函數(shù)還是 mutator 方法將信息注入已創(chuàng)建的 Java 對象。
在 Spring 中,注入的屬性 — 或到其他 bean 的引用 — 是通過一個 XML 文件進(jìn)行配置的,這使得配置輕而易舉。它耦合了另外一個 AOP 框架,允許非侵入性增加諸如事務(wù)處理和安全等屬性,這意味著開發(fā)人員可以專注于創(chuàng)建業(yè)務(wù)解決方案,而不必忙于復(fù)雜的 Java EE 開發(fā)或配置。由于容器是非侵入性的,所以您不必?fù)?dān)心業(yè)務(wù)代碼會被特定于供應(yīng)商(此處也包括 Spring)的構(gòu)件所污染。
Spring 應(yīng)用程序組件
如上所述,Spring 提供了一個輕型容器,用于提供集中式、自動化的配置并連接應(yīng)用程序?qū)ο蟆T撊萜魇?非侵入性的,能夠以一致、透明的方式通過 IoC 將一組松耦合的組件 (POJO) 組裝成復(fù)雜的系統(tǒng)。 因?yàn)樵撊萜髟试S首先獨(dú)立地開發(fā)和測試各軟件組件,然后在任意環(huán)境(Java SE 或 Java EE)中進(jìn)行擴(kuò)展部署,所以它具有靈活性和高利用率,并提高了應(yīng)用程序的可測試性和可伸縮性 此外,Spring 提供了許多其他對開發(fā)人員友好的特性,下面我們一一列舉:
-
用于事務(wù)管理的通用抽象層:支持可插入的事務(wù)管理器,使事務(wù)劃分更輕松,同時無需處理底層的問題。該層中還包括 JTA 策略和一個 JDBC DataSource。相比普通的 JTA 或 EJB CMT,Spring 的事務(wù)支持不依賴于 Java EE 環(huán)境。考慮到是一個十分靈活的非侵入性解決方案,事務(wù)語義通過 AOP 應(yīng)用于 POJO,通過 XML 或 Java SE 5 注釋進(jìn)行配置。
-
JDBC 抽象層:提供了一個有意義的異常層次結(jié)構(gòu)(不再從 SQLException 抽取供應(yīng)商代碼),簡化了錯誤處理,極大地減少了代碼編寫量。無需為了再次使用 JDBC 編寫另外的 finally 代碼塊。面向 JDBC 的異常遵循 Spring 的一般 DAO 異常層次結(jié)構(gòu)。
-
與業(yè)界領(lǐng)先的對象關(guān)系映射解決方案的集成:在資源擁有者、DAO 實(shí)現(xiàn)支持和事務(wù)策略方面。 對大量 IoC 便利特性的一流支持,解決了許多典型的 O-R 映射集成問題。所有這些都遵循 Spring 的一般事務(wù)和 DAO 異常層次結(jié)構(gòu)。而且,Spring 2.0 提供了與 Java 持久性 API (JPA) 的完全集成。
-
AOP 功能:完全集成到 Spring 配置管理中。您可以對 Spring 所管理的任何對象啟用 AOP,增加了聲明性事務(wù)管理等方面。 借助于 Spring,您能夠擁有沒有 EJB 的聲明性事務(wù)管理 — 甚至也可以沒有 JTA。
-
靈活的 MVC Web 應(yīng)用程序框架:構(gòu)建在核心的 Sping 功能之上。該框架是通過策略接口高度可配置的,并且適用于多種視圖技術(shù),如 JSP、Velocity、Tiles、iText 和 POI。注意,Spring 中間層可以輕松地與基于任何其他 Web MVC 框架(如 Struts、WebWork 或 Tapestry)的 Web 層組合。
-
用戶可擴(kuò)展的配置層:允許用戶在 vanilla Spring 配置中加入自己定制的 XML 標(biāo)記。整個 Spring 2.0 核心庫已經(jīng)廣泛地使用此功能,以提供增強(qiáng)的語法和通用 Spring 特性的可用性。
-
異步編程抽象:包括與 JMS 提供者的進(jìn)行框架無關(guān)的事務(wù)集成的消息驅(qū)動的 POJO (MDP);與異步調(diào)度機(jī)制的集成,如 commonj、Java SE 并行程序和 Quartz;本地事件支持。
所有的 Spring 功能都可以在任何 Java EE 服務(wù)器上使用,大部分功能可以在非托管環(huán)境中使用。Spring 的一個重心是支持可重用業(yè)務(wù)和不依賴于特定的 Java EE 服務(wù)的數(shù)據(jù)訪問對象。這些對象可以不費(fèi)事地跨 Java EE 環(huán)境(Web 或 EJB)、獨(dú)立應(yīng)用程序和測試環(huán)境進(jìn)行重用。
Spring 的分層體系結(jié)構(gòu)提供了大量靈活性。 其所有功能都構(gòu)建在較低的層次上。例如,您可以在不使用 MVC 框架或沒有 AOP 支持的情況下使用 JavaBeans 配置管理。但是,如果您要使用 Web MVC 框架或 AOP 支持,您會發(fā)現(xiàn)它們構(gòu)建在配置框架之上,所以您可以馬上應(yīng)用有關(guān)它的知識。
BEA WebLogic Server 9.2 簡介
在本節(jié),我們將簡要概述 BEA WebLogic Server 的特性,重點(diǎn)強(qiáng)調(diào)其提供的底層基礎(chǔ)架構(gòu),而不是編程模型。
WebLogic Server 是可伸縮的企業(yè)級 Java EE 應(yīng)用服務(wù)器。WebLogic Server 基礎(chǔ)架構(gòu)支持各類分布式應(yīng)用程序的部署,是構(gòu)建各種應(yīng)用程序的理想基礎(chǔ)。
Sun Microsystem 公司的 Java EE 1.4 規(guī)范在 WebLogic Server 上的實(shí)現(xiàn)提供了一組標(biāo)準(zhǔn)的 API,用以創(chuàng)建能夠訪問多種服務(wù)(如數(shù)據(jù)庫、消息傳遞服務(wù)和外部企業(yè)系統(tǒng)連接)的分布式 Java 應(yīng)用程序。終端用戶客戶程序使用 Web 瀏覽器客戶端或 Java 客戶端訪問這些應(yīng)用程序。由于 Java EE 是如此有名,這里我們就不進(jìn)一步討論了。參見關(guān)于編程模型的 WebLogic Server 文檔,可以獲得更多信息。
除了實(shí)現(xiàn) Java EE 之外,WebLogic Server 還使企業(yè)能夠在一個健壯的、安全的、高可用的、可伸縮的環(huán)境中部署任務(wù)關(guān)鍵型應(yīng)用程序。這些特性允許企業(yè)配置 WebLogic Server 實(shí)例集群以分布負(fù)載,并在發(fā)生硬件或其他故障時提供額外的容量。新的診斷工具允許系統(tǒng)管理員監(jiān)視和調(diào)優(yōu)已部署的應(yīng)用程序和 WebLogic Server 環(huán)境本身的性能。您還可以對 WebLogic Server 進(jìn)行配置以自動監(jiān)視和調(diào)整應(yīng)用程序吞吐量,無需人工干預(yù)。廣泛的安全特性保護(hù)了對服務(wù)的訪問,保證了企業(yè)數(shù)據(jù)安全,并阻止了惡意攻擊。
WebLogic Server 增強(qiáng)的服務(wù)質(zhì)量
與許多其他 BEA 產(chǎn)品一樣,WebLogic Server 如同冰山,浮在水面上的只是很少的一部分而已。具體來說,WebLogic Server 提供了許多特性和工具來支持高可用、可伸縮的應(yīng)用程序部署:
-
WebLogic Server 集群通過將工作負(fù)載分布到多個 WebLogic Server 實(shí)例之間,為您的應(yīng)用程序提供可伸縮性和可靠性。基于要處理的工作量,傳入的請求可以路由到集群中的一個 WebLogic Server 實(shí)例。如果出現(xiàn)硬件或其他故障,會話狀態(tài)對其他可恢復(fù)故障節(jié)點(diǎn)工作的集群節(jié)點(diǎn)可用。此外,可以實(shí)現(xiàn)集群,使服務(wù)駐留在這樣的單臺計(jì)算機(jī)上:如果出現(xiàn)故障,該計(jì)算機(jī)可以選擇將服務(wù)遷移到集群中的另一個節(jié)點(diǎn)上。
-
除了在一個集群內(nèi)跨服務(wù)器復(fù)制 HTTP 會話狀態(tài)之外,WebLogic Server 還能夠跨多個集群復(fù)制 HTTP 會話狀態(tài),從而在多個地理區(qū)域、電網(wǎng)和 Internet 服務(wù)提供商中擴(kuò)展可用性和容錯能力。
-
Work Manager 基于您定義的規(guī)則劃分工作優(yōu)先級,并監(jiān)視實(shí)際的運(yùn)行時性能統(tǒng)計(jì)信息。然后利用這些信息優(yōu)化應(yīng)用程序的性能。Work Manager 可以全局應(yīng)用于一個 WebLogic Server 域或者一個特定的應(yīng)用程序組件。
-
過載保護(hù)使 WebLogic Server 能夠檢測和避免過載情況,并從中得以恢復(fù)正常。
-
網(wǎng)絡(luò)通道基于流量類型將網(wǎng)絡(luò)流量分散到各個通道中,有利于網(wǎng)絡(luò)資源的有效使用。
-
WebLogic Server 持久存儲 是一個性能卓越的內(nèi)置存儲器解決方案,針對需要持久存儲的 WebLogic Server 子系統(tǒng)和服務(wù)。例如,它可以存儲持久的 JMS 消息,或者臨時存儲使用存儲-轉(zhuǎn)發(fā)特性發(fā)送的消息。持久存儲支持到基于文件的存儲器或到支持 JDBC 的數(shù)據(jù)庫的持久性。
-
存儲-轉(zhuǎn)發(fā)服務(wù)使 WebLogic Server 可以在跨 WebLogic Server 實(shí)例分布的應(yīng)用程序之間可靠地傳遞消息。如果發(fā)送消息時由于網(wǎng)絡(luò)或系統(tǒng)故障造成消息目標(biāo)不可用,那么一個本地服務(wù)器實(shí)例將保存消息,并且當(dāng)遠(yuǎn)程目標(biāo)可用時轉(zhuǎn)發(fā)。
-
企業(yè)級就緒部署工具使應(yīng)用程序簡化了從開發(fā)階段到生產(chǎn)環(huán)境的部署和移植。
-
生產(chǎn)環(huán)境重新部署使企業(yè)能夠在不中斷舊版程序工作進(jìn)程的情況下部署新版本。
?
現(xiàn)在,讓我們來看看這兩個系統(tǒng)之間的協(xié)作。
在 Java EE 和 Spring 中開發(fā)應(yīng)用程序
為了比較和對照 Java EE 和 Spring 開發(fā)方法的差別,我們使用 Spring 2.0 Framework 重新編寫了 MedRec 示例程序,充分利用了 Spring 2.0 的許多創(chuàng)新特性。在下一節(jié),我們將簡要介紹 MedRec 的總體體系結(jié)構(gòu),然后依次了解它的 Java EE 形式和 Spring 形式。
Medical Records 應(yīng)用程序
Avitek Medical Records(或 MedRec)是一個 WebLogic Server 示例程序套件,簡明演示了 Java EE 平臺的各個方面。MedRec 旨在作為各層次 Java EE 開發(fā)人員的一個培訓(xùn)工具。它顯示了每個 Java EE 組件的使用方法,闡明了適于組件交互和客戶端開發(fā)的設(shè)計(jì)模式。MedRec 還闡釋了使用 WebLogic Server 開發(fā)和部署應(yīng)用程序的最佳實(shí)踐。
MedRec 背后的真實(shí)概念是一個框架,其中患者、醫(yī)生、管理人員使用各種不同的客戶端管理患者數(shù)據(jù)。對于患者,MedRec 提供基于 Web 的應(yīng)用程序,供他們查看自己的醫(yī)療記錄和維護(hù)檔案文件。MedRec 為管理人員提供基于 Web 的應(yīng)用程序,用于管理入院登記、醫(yī)療記錄上載和常規(guī)應(yīng)用程序監(jiān)視。MedRec 還提供與獨(dú)立醫(yī)療機(jī)構(gòu)接合的資源。為了演示這個通信系統(tǒng),MedRec 包括一個醫(yī)生應(yīng)用程序,用于向 MedRec 系統(tǒng)請求和提供數(shù)據(jù)。
Java EE 版的 MedRec 體系結(jié)構(gòu)概述
Java EE 和 WebLogic Server 版的 MedRec 的設(shè)計(jì)和實(shí)現(xiàn)采用傳統(tǒng)的三層體系結(jié)構(gòu)模型,分為相互獨(dú)立的客戶端、服務(wù)器和數(shù)據(jù)存儲三個部分:
-
表示層:該層負(fù)責(zé)所有用戶交互;有時也稱作客戶端層。
-
服務(wù)層:該層是封裝了應(yīng)用程序業(yè)務(wù)邏輯的中間層。服務(wù)層處理來自異構(gòu)客戶端的請求,同時與各種后端系統(tǒng)進(jìn)行交互,包括數(shù)據(jù)存儲。該層有時也稱作服務(wù)器層。
-
企業(yè)信息系統(tǒng) (EIS) 層:該層表示那些提供和/或存儲原有應(yīng)用程序和數(shù)據(jù)庫之類數(shù)據(jù)的系統(tǒng)。EIS 層有時也稱作數(shù)據(jù)存儲。
我們?yōu)?MedRec 的患者和管理部門程序開發(fā)了 Web 應(yīng)用程序 (webapp) 以公開針對各自用戶的服務(wù)。webapp 遵循模型-視圖-控制器模式,Java Server Pages 將視圖呈現(xiàn)給用戶,模型封裝要呈現(xiàn)給用戶和從用戶處捕獲的數(shù)據(jù),而控制器機(jī)制則管理除與服務(wù)層交互之外的組件交互。MedRec 采用 Jakarta Struts 實(shí)現(xiàn)該模式。
服務(wù)層為發(fā)出請求的客戶端提供服務(wù),并管理與后端應(yīng)用程序和資源的交互。 MedRec 的服務(wù)層采用會話外觀模式封裝業(yè)務(wù)邏輯和業(yè)務(wù)數(shù)據(jù)。會話外觀通過提供一個到分布式服務(wù)的接口,簡化了應(yīng)用程序的復(fù)雜性。在 MedRec 中,會話外觀的首要責(zé)任是提供數(shù)據(jù)吞吐量。在 MedRec 的 Java EE 和 WebLogic Server 版本中,會話外觀被開發(fā)為無狀態(tài)的會話企業(yè) JavaBeans,而數(shù)據(jù)則由實(shí)體企業(yè) JavaBeans 管理。
為了與外部實(shí)體接合,MedRec 通過 Web 服務(wù)公開應(yīng)用程序功能,從而允許在不同系統(tǒng)之間使用一系列開放標(biāo)準(zhǔn)進(jìn)行動態(tài)交互。通過 Web 服務(wù)公開服務(wù),MedRec 可以為獨(dú)立的各方提供數(shù)據(jù)或接收來自各方的數(shù)據(jù),這樣就實(shí)現(xiàn)了集中式醫(yī)療記錄管理的主要目標(biāo)。
圖 1 闡釋了 Java EE 和 WebLogic 版 MedRec 的高級體系結(jié)構(gòu)圖。
圖 1:J2EE 版 MedRec 的體系結(jié)構(gòu)圖
使用 Spring 重新表示 MedRec
為了使 Spring 能夠利用 WebLogic Server 的企業(yè)特性,對 MedRec 的體系結(jié)構(gòu)進(jìn)行了重新設(shè)計(jì),用相應(yīng)的 Spring 組件替換了核心的 Java EE 組件。我們用基于 Spring 的 MedRec 版本 (MedRec-Spring) 復(fù)制了與原版 MedRec 相同的功能。
控制反轉(zhuǎn)
MedRec-Spring 最顯著的變化是引入了 Spring IoC。IoC 方法功能強(qiáng)大,通過一個容器將相關(guān)性注入到配置好的組件中而應(yīng)用。 IoC 將應(yīng)用程序代碼與其配置相分離。例如,對象與其相關(guān)性無關(guān),因此可以專注于其職責(zé)。在 MedRec-Spring 案例中,諸如數(shù)據(jù)源、JMS 服務(wù)、MBean 連接和對等服務(wù)等企業(yè)資源在運(yùn)行時被提供給 MedRec-Spring 的對象。另外,通過遷移資源配置和在已編譯代碼外進(jìn)行引用,應(yīng)用程序從特定于開發(fā)的資源向中間的生產(chǎn)資源和環(huán)境的轉(zhuǎn)移更加易于管理。
我們發(fā)現(xiàn),要正確使用 IoC,應(yīng)用程序代碼需要遵循更嚴(yán)格的 Java 編程規(guī)則 — 特別是在編寫接口的代碼時。接口比其他東西更能促進(jìn)更好的協(xié)作,因?yàn)榭梢詼p輕依賴性,而且實(shí)現(xiàn)的變化被隔離開來。 從 IoC 的角度看,接口支持相關(guān)性注入的可插入本性。為了利用 IoC,我們對 MedRec-Spring 進(jìn)行了重構(gòu),這樣就可以基于接口對業(yè)務(wù)對象進(jìn)行編碼。
POJO
在 MedRec-Spring 中,傳統(tǒng) Java 對象 (POJO) 代替了無狀態(tài)會話 EJB。無狀態(tài)會話 EJB 的強(qiáng)大在于它們的遠(yuǎn)程控制和事務(wù)管理功能。 因?yàn)?MedRec-Spring 通過 Spring 的 HTTP Invoker 體系結(jié)構(gòu)公開了服務(wù) bean,所以它能夠滿足遠(yuǎn)程控制的要求。 事務(wù)管理是由 Spring 的事務(wù)抽象層提供的。MedRec-Spring 的事務(wù)管理精確地鏡像了 MedRec 的事務(wù)管理,因?yàn)?Spring 事務(wù)管理器配置為將責(zé)任委托給 WebLogic Server 的 JTA 事務(wù)管理器。
消息處理
MedRec-Spring 包含原始 MedRec 的大多數(shù)消息處理功能。我們采用 Spring 的 JMS 程序包簡化了一些一般性任務(wù),如連接工廠和目標(biāo)查找。Spring 提供了一個代表消息目標(biāo)的對象,而不是通過程序獲取隊(duì)列句柄。與所有 Spring bean 一樣,這些對象表示(JNDI 名稱、連接工廠關(guān)聯(lián)等)是在已編譯代碼的外部配置的。 我們還在三個領(lǐng)域使用了 Spring 2.0 的消息驅(qū)動的 POJO (MDP) 作為 JMS 消息的目標(biāo):
- 處理郵件消息(向患者發(fā)送批準(zhǔn)郵件或拒絕郵件)
- 處理注冊消息(處理新患者注冊)
- 處理醫(yī)療記錄上載(從 XML 文件向 RDBMS 上載醫(yī)療記錄)
AOP
MedRec-Spring 使用 Spring AOP 主要有兩個目的:
- 聲明性事務(wù)管理
- DAO 實(shí)現(xiàn)后處理 (JPA) 的返回值
JPA
MedRec-Spring 現(xiàn)在使用 JPA 訪問和寫入患者記錄。有關(guān)更多詳細(xì)信息,請參見“結(jié)合使用 JAVA 持久性 API 和 SPRING 2.0”。
應(yīng)用程序管理
MedRec-Spring 包含應(yīng)用程序管理特性。這些特性與 WebLogic Server 的域配置以及運(yùn)行時域交互。MedRec-Spring 必須按照 WebLogic Server 的 MBean Server 形式,Spring 提供了連接管理,簡化了 MBean Server 的可訪問性。
Web 服務(wù)
最后,MedRec-Spring 使用 Web 服務(wù)導(dǎo)出它的服務(wù)。 Spring 提供一個 JAX-RPC 工廠用于生成 Web 服務(wù)的代理。與其他 Spring bean 類似,工廠 bean 也是在已編譯的代碼外部配置的,使得應(yīng)用程序更加靈活。
圖 2 顯示基于 Spring 的 MedRec 版本的高級體系結(jié)構(gòu)圖。
圖 2:基于 Spring 的 MedRec 版本的高級體系結(jié)構(gòu)圖
WebLogic Server 上的 Spring 最佳實(shí)踐
比較了 Java EE 和 Spring 環(huán)境上的 MedRec 體系結(jié)構(gòu)之后,現(xiàn)在我們來介紹在實(shí)現(xiàn) MedRec-Spring 應(yīng)用程序過程中發(fā)現(xiàn)的一些寶貴經(jīng)驗(yàn):
-
使用延遲初始化。為了實(shí)現(xiàn) IoC 容器,Spring 加載一個 應(yīng)用程序上下文 文件,創(chuàng)建并緩存每個已配置的 bean 實(shí)例。Spring bean 引用的每個資源都必須可以實(shí)例化或查找,了解這一點(diǎn)很重要。例如,Spring 的 JMX 支持提供到 WebLogic Server 的 MBean 服務(wù)器的連接。部署期間,并非所有 MBean 服務(wù)器都是激活的,因此在部署資源時,用戶應(yīng)該一啟動即使用 Spring 延遲初始化和查找服務(wù)。
-
基于功能分離出 Spring 配置。 這允許應(yīng)用程序組件僅加載那些與自身工作職責(zé)相關(guān)的上下文。該實(shí)踐還允許測試人員用一個特定于測試環(huán)境的上下文替換一個應(yīng)用程序上下文(例如,數(shù)據(jù)源配置),從而改變其行為。
-
通過 JndiObjectFactoryBean 封裝 JDBC 數(shù)據(jù)源連接池 。則那些要求數(shù)據(jù)庫交互的 bean 可以引用該 bean,以利用 WebLogic Server 的數(shù)據(jù)源連接池功能。
-
將 Spring 的 org.springframework.ejb.support 用于會話和消息驅(qū)動的企業(yè) JavaBeans 。Spring 的 org.springframework.ejb.support 提供企業(yè) JavaBeans (EJB) 可以擴(kuò)展的抽象類。這些抽象的 EJB 類通過包含 EJB 生命周期方法的標(biāo)準(zhǔn)實(shí)現(xiàn)來輔助開發(fā)。更重要的是,這些類提供了加載 Spring 應(yīng)用程序上下文的機(jī)制,包括跨多個 EJB 和客戶端共享上下文,因此在 EJB 初始化時減少了重復(fù)和開銷。
-
利用熱部署和 WebLogic Server 的拆分開發(fā)目錄環(huán)境。 這極大地提升了集成測試期間的 Spring 開發(fā)體驗(yàn)。熱部署允許應(yīng)用程序重新加載,而無需重新啟動服務(wù)器。拆分開發(fā)目錄環(huán)境減少了不必要的文件復(fù)制,加快了開發(fā)和部署。拆分開發(fā)目錄 Ant 任務(wù)幫助您快速地重新編譯和重新部署應(yīng)用程序,無需先生成一個可部署的存檔文件或展開的存檔目錄。
-
將 Spring 庫打包為應(yīng)用程序庫、可選的擴(kuò)展或服務(wù)器擴(kuò)展。這允許幾個 Spring 應(yīng)用程序共享 Spring Framework,減少了應(yīng)用程序所占空間。不僅減少了內(nèi)存占用,而且還提高了部署次數(shù)。
Spring on WebLogic Server 工具包
為幫助您從部署在 WebLogic Server 上的 Spring 應(yīng)用程序得到最大收獲,我們已經(jīng)發(fā)布了一個經(jīng)過認(rèn)證的 BEA 發(fā)行版,包括 Spring 2.0、MedRec on Spring 應(yīng)用程序和其他一些不錯的工具。可以從 BEA 的發(fā)行版 Web 站點(diǎn)上免費(fèi)下載此工具包。
?
Spring 2.0.1 與 BEA WebLogic Server 9.2 的集成
頁面: 1, 2, 3, 4
企業(yè) Spring
Spring Framework 的非侵入性 IoC 開發(fā)模型不但依賴于 Java EE 應(yīng)用服務(wù)器可用的特性集,而在旨在補(bǔ)充該特性集。事實(shí)上,在要求很高的生產(chǎn)環(huán)境中,底層應(yīng)用服務(wù)器基礎(chǔ)架構(gòu)提供的服務(wù)質(zhì)量對 Spring 應(yīng)用程序的持續(xù)可靠性、可用性和性能非常重要。WebLogic Server 9.2 提供了企業(yè)級特性,能夠從各方面增強(qiáng)您的 Spring 應(yīng)用程序。在本節(jié)中,我們將詳述這些特性以及如何在 Spring 應(yīng)用程序中利用它們。
集群管理和部署
一個 WebLogic Server 集群包括多個 WebLogic Server 服務(wù)器實(shí)例,這些服務(wù)器實(shí)例同時運(yùn)行并一起工作,從而提高了可伸縮性和可靠性。對客戶端來說,集群就像單個 WebLogic Server 實(shí)例一樣。構(gòu)成集群的服務(wù)器實(shí)例既可運(yùn)行在同一臺計(jì)算機(jī)上,也可位于不同的計(jì)算機(jī)上。可以通過在現(xiàn)有的計(jì)算機(jī)上向集群添加額外的服務(wù)器實(shí)例,或者向集群添加計(jì)算機(jī)以托管增加的服務(wù)器實(shí)例,來提高集群的容量。WebLogic Server 集群為 Spring 應(yīng)用程序提供了一個企業(yè)級部署平臺,WebLogic Server 提供的豐富性和易用性是其他支持相似特性的技術(shù)所不具備的。有關(guān) WebLogic Server 集群的配置和管理的完整討論,請參見“Understanding Cluster Configuration”。
通常,Spring 應(yīng)用程序被打包成 webapp 形式,在這種情況下,您無需為了利用 WebLogic Server 集群而更改自己的應(yīng)用程序。只需將應(yīng)用程序部署到集群中的服務(wù)器,即可體驗(yàn)增強(qiáng)的可伸縮性和可用性帶來的好處。
Spring 會話復(fù)制
Spring Web 應(yīng)用程序通常將信息存儲在 HTTP 會話中,如訂單 ID 和用戶信息。為了支持一個集群內(nèi)的 servlet 和 JSP 的自動復(fù)制和故障切換,WebLogic Server 支持集中用于保持 TTP 會話狀態(tài)的機(jī)制。只需為用戶應(yīng)用程序提供一個適當(dāng)?shù)?weblogic.xml 部署描述符,它們就能夠被 Spring Web 應(yīng)用程序非侵入性地使用。獲取 WebLogic Server 9.0 的提供的有關(guān)如何配置各種類型的會話持久性的更多信息。
集群化的 Spring 遠(yuǎn)程控制
Spring 提供強(qiáng)大的遠(yuǎn)程控制支持,允許您仍然利用一致的基于 POJO 的編程模型輕松地導(dǎo)出和使用遠(yuǎn)程服務(wù)。通過一個接合到適當(dāng) Spring bean 的 RMI 接口,Vanilla Spring 支持代理 POJO 調(diào)用。然而,這種支持僅限于 JRMP(Sun 的 RMI 實(shí)現(xiàn)),或者通過 JndiRmiProxyFactoryBean 使用特定的遠(yuǎn)程接口。借助于 Spring 1.2.5 on WebLogic Server 9.0 認(rèn)證,我們已經(jīng)擴(kuò)展了 JndiRmiProxyFactoryBean 和相關(guān)的服務(wù)導(dǎo)出程序 — 這樣它就能支持任何 J2EE RMI 實(shí)現(xiàn)的 POJO 代理,包括 RMI-IIOP 和 T3。這方面的支持還包括一個 WebLogic RMI 部署描述符,它支持代理 RMI 接口上的集群化,因此 POJO 調(diào)用可以在一個 WebLogic Server 集群內(nèi)進(jìn)行負(fù)載均衡。客戶端上這種支持的配置與此相似 ( 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>服務(wù)導(dǎo)出程序如下(同樣來自 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>集群化的描述符自動包含在其中,僅要求適當(dāng)?shù)募号渲靡约霸谒屑撼蓡T上部署 Spring 應(yīng)用程序。獲得有關(guān)故障切換支持的更多信息。
對 Spring 組件的控制臺支持
Spring on WebLogic Server 工具包是一個 WebLogic Server 控制臺擴(kuò)展,它顯示了應(yīng)用程序中定義的 Spring bean、屬性和操作。它構(gòu)建在 WebLogic 控制臺擴(kuò)展門戶框架之上,該框架可以轉(zhuǎn)換 WebLogic Administration 控制臺的外觀、功能和布局,而無需修改服務(wù)器或控制臺代碼。將控制臺擴(kuò)展復(fù)制到 yourdomain/console-ext 目錄后即進(jìn)行了部署,隨后服務(wù)器重新啟動。有關(guān)部署控制臺擴(kuò)展的更多詳細(xì)信息,請參考 Spring on WebLogic Server 工具包。
控制臺擴(kuò)展為不是 MBean 的 Spring bean 自動創(chuàng)建 (JMX) 管理接口(對于多數(shù) Spring bean,通常就是這樣),通過在 applicationContext.xml 中配置一個 MBeanExporter 并指定經(jīng)匯編程序公開的 bean 來完成。該特性是 Spring 和 WebLogic Server 無縫地、非侵入性協(xié)作的一個極好的例證。 為了使 Spring 應(yīng)用程序支持 JMX,只需更改應(yīng)用程序上下文部署描述符。為了使控制臺支持 Spring,只需要將兩個 jar 部署到現(xiàn)有域即可。
為了在 WebLogic Server 的 Administration 控制臺啟用 Spring Console 擴(kuò)展,需要兩個 jar 文件;它們作為 Spring WebLogic 程序包的一部分提供。具體來說,這兩個所需的 jar 文件稱為 spring-ext-server.jar 和 spring-ext-client.jar。 spring-ext-server.jar 需要復(fù)制到 yourdomain/console-ext 目錄。相關(guān)的 spring-ext-client.jar 文件需要和 Web 應(yīng)用程序一道部署。(如果是 .WAR 文件,則將 spring-ext-client.jar 放入 Web 應(yīng)用程序的 WEB-INF/lib 目錄。)
有了這兩個文件后,剩下的工作就是在 Spring XML 配置文件中定義幾個 bean。第一個絕對要定義的 Spring bean 是 com.interface21.wl9.jmx.mediator.Mediator bean。這個 bean(顧名思義)介于用戶應(yīng)用程序、WebLogic Server 的 MBeanServer 和管理控制臺三者之間。它的定義如以下示例所示,是個非常簡單的 bean:
<!-- WLS console adapter bean --><bean id="consoleAdapter" class="com.interface21.wl9.jmx.mediator.Mediator"/>這個 bean 必須被“插入”(或說相關(guān)性注入)第二個 bean 中,即 MBeanExporter,它也是絕對必須進(jìn)行配置的。 MBeanExporter 類交付的成果就是只需將 Spring 應(yīng)用程序上下文中已定義的任意數(shù)量的不同 bean 導(dǎo)出到 BEA WebLogic MBeanServer(或者任何配置好的 MBeanServer)。注意,MBeanServer 導(dǎo)出的那些 bean 無需為 JMX 進(jìn)行編碼。Spring JMX 基礎(chǔ)架構(gòu)代碼負(fù)責(zé)生成 ModelMBean 來描述通過 JMX 為了進(jìn)行管理而導(dǎo)出的 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 提供的所有內(nèi)容不在本文的討論范圍內(nèi)。此處只需說明一點(diǎn)就夠了,那就是上面定義的 InterfaceBasedMBeanInfoAssembler bean 是一個可能的策略,用以控制用戶 bean 的哪些方法和屬性實(shí)際地公開出來供管理之用,就像 JMX 操作和屬性那樣。 InterfaceBasedMBeanInfoAssembler 使用(任意地)接口決定導(dǎo)出哪些方法和屬性。有關(guān)更多信息,請參閱本文末尾的“參考資料”一節(jié)。
MBeanExporter 的 bean 定義上的第二個著名屬性是 server 屬性。 這是向 MBeanExporter 注入一個 WebLogic Server 的 MBeanServer 實(shí)例的地方。MBeanExporter 將所有已配置的 bean 導(dǎo)出到這一特定的服務(wù)器。該 bean 的定義如下所示:
<!-- WebLogic 9 MBeanServer --><jndi:jndi-lookup id="server" jndi-name="java:comp/env/jmx/runtime"/>在 server bean 的這個定義中,實(shí)際上 MBeanServer 實(shí)例源自 JNDI(使用為 jndiName 屬性指定的值在上下文中查找)。對于 MBeanExporter,MBeanServer 源自 JNDI 的事實(shí)沒有意義;這個將相關(guān)性注入需要相關(guān)性的對象透明源引是相關(guān)性注入方法的一大附加值(上面所見的易于使用和配置的 JndiObjectFactoryBean 證明 Spring 的注入支持是非常高級的)。
最后,最有趣的是 MBeanExporter 配置的一部分是 beans 屬性。 beans 屬性是 (JMX) ObjectName 到 bean 的簡單映射,這些 bean 將導(dǎo)出到先前注入的 MBeanServer 實(shí)例以便管理。選擇 ObjectName 的策略(在這種策略下,您的 bean 實(shí)際上會導(dǎo)出到 MBeanServer)是完全可配置的。在本例中,所用的默認(rèn)策略是只需使用 beans 映射的鍵作為 ObjectName。(有關(guān)各種 ObjectName 策略的全面綱要,請參見隨 Spring 一起提供的 JavaDoc。)
Web 服務(wù)支持
Spring 的遠(yuǎn)程控制功能的另一個方面是它對 RPC 風(fēng)格的 Web 服務(wù)的支持。WebLogic Server 提供了基于 Ant 的工具,可以根據(jù) Web 服務(wù)的描述生成 JAX-RPC 存根。Web 服務(wù)客戶端使用這些生成的存根獲取一個表示服務(wù)器端操作的遠(yuǎn)程接口。Spring 通過提供一個 JaxRpcPortProxyFactoryBean 簡化了這個過程。
我們發(fā)現(xiàn),在 WebLogic Server 環(huán)境中正確地配置 JaxRpcPortProxyFactoryBean 有些棘手,所以為了節(jié)約您的時間,我們給出下面這個代碼片段,演示如何為一個包含復(fù)雜類型的文檔字面包裝的 Web 服務(wù)配置代理生成。
多數(shù)屬性是自解釋的。有幾個屬性比較有名:
-
serviceInterface 是 Spring setter 注入的副產(chǎn)品。這個類將表示 Web 服務(wù)操作。
-
customProperties 屬性支持定制的 WebLogic Server Web 服務(wù)存根屬性。
-
jaxRpcService 值設(shè)置為 WebLogic Server 的生成的 JAX-RPC 實(shí)現(xiàn)服務(wù)。JAX-RPC 服務(wù)負(fù)責(zé)驗(yàn)證 Web 服務(wù)和加載復(fù)雜類型映射。為了實(shí)現(xiàn)后者,WebLogic Server 的 JAX-RPC 實(shí)現(xiàn)服務(wù)必須配置為一個 Spring bean。這可以確保 JAX-RPC 服務(wù)構(gòu)造函數(shù)的運(yùn)行,而且類型映射文件也在此加載。
在 JaxRpcPortProxyFactoryBean 上將 lookupServiceOnStartup 設(shè)置為 false,即可在啟動時關(guān)閉 JAX-RPC 服務(wù)查找。當(dāng)首次訪問時,將會進(jìn)行查找。這對于與可靠的 WebLogic Server 請求/響應(yīng) Web 服務(wù)通信是必需的,而此處的客戶端也必須是一個 Web 服務(wù)。在這些情況下,始發(fā)客戶端通常是與 Web 服務(wù)客戶端一起部署的。 因?yàn)閼?yīng)用程序部署完成前不會激活 Web 服務(wù),所以客戶端 Web 服務(wù)對于 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>有關(guān)更多信息,請參見 WebLogic Server 的 Overview Web Services Invocation 和 Remoting and Web Services Using Spring。
?
安全性
WebLogic Server 安全系統(tǒng)支持并擴(kuò)展了 Java EE 的安全性,同時提供了一組豐富的安全提供程序,可以對其進(jìn)行定制以處理不同的安全性數(shù)據(jù)庫或安全性策略。除了使用標(biāo)準(zhǔn)的 Java EE 安全性之外,應(yīng)用程序編程人員還可以使用很多專有擴(kuò)展,這些擴(kuò)展使應(yīng)用程序可以與安全系統(tǒng)緊密集成。 WebLogic Server 附帶了幾個安全提供程序,例如,可以選擇包含大部分流行 LDAP 服務(wù)器的身份驗(yàn)證數(shù)據(jù)庫、Active Directory、本地 Windows 和內(nèi)置的身份驗(yàn)證解決方案。可以使用定制的提供程序?qū)?nèi)置的提供程序進(jìn)行擴(kuò)充,從而幾乎可以與任意身份驗(yàn)證數(shù)據(jù)庫、授權(quán)機(jī)制和憑證映射服務(wù)相集成。由于部署為 webapp 的 Spring 應(yīng)用程序使用的是 Java EE 安全性,因此無需修改應(yīng)用程序即可獲得 WebLogic Server 的安全性優(yōu)點(diǎn)。
經(jīng)驗(yàn)豐富的 Spring 用戶還會熟悉 Acegi — Spring 自身的安全框架。目前,可以在應(yīng)用程序中使用 Acegi、WebLogic Server 安全性或同時使用二者,因?yàn)樗鼈兪窍嗷オ?dú)立的。 稍后我們將講述與此相關(guān)的更多信息。
分布式事務(wù)
Spring 提供事務(wù)管理的基礎(chǔ)架構(gòu)。除了對各家數(shù)據(jù)庫供應(yīng)商的支持之外,Spring 還通過一家 Java EE 供應(yīng)商的 JTA 實(shí)現(xiàn)支持分布式事務(wù)。通過 WebLogicJtaTransactionManager,可以將 Spring 的 JTA 管理器配置為與 WebLogic Server 的 JTA 實(shí)現(xiàn)一起工作。
WebLogicJtaTransactionManager 直接向 WebLogic Server 的 Java Transaction API 委托責(zé)任。通過 JNDI,客戶端和 bean 提供程序可以使用 WebLogic Server JTA TransactionManager 接口,這一交互由 Spring 管理。事務(wù)管理器也支持事務(wù)的作用域;事務(wù)能夠作用于集群和域的內(nèi)部或二者之間。
WebLogicJtaTransactionManager 最強(qiáng)大的特性是管理分布式事務(wù)的能力和用于企業(yè)應(yīng)用程序的兩階段委托協(xié)議。使用 WebLogicJtaTransactionManager,應(yīng)用程序能夠利用 WebLogic Administration Console 來進(jìn)行事務(wù)監(jiān)控。 WebLogicJtaTransactionManager 還支持按數(shù)據(jù)庫隔離級別,允許復(fù)雜的事務(wù)處理配置。下面的代碼節(jié)選自 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>有關(guān)更多信息,請參見 Overview of Transactions in WebLogic Server Applications 和“在 Spring 中實(shí)現(xiàn)事務(wù)掛起”。
消息驅(qū)動的 POJO
消息驅(qū)動的 POJO (MDP) 替代了 Java EE 的消息驅(qū)動的 Bean (MDB)。與 POJO 類似,它們的優(yōu)勢也是不要求任何特定于平臺的 API 擴(kuò)展或結(jié)構(gòu)。它們只需要標(biāo)準(zhǔn)的 JMS API 實(shí)現(xiàn):
public class RegistrationMessageListener implements MessageListener {public void onMessage(Message message) {// Fetch Registration information from ObjectMessage.// Process new reg by invoking service (DI)// ... }}與 Spring 的大多數(shù)成員一樣,MDP 容器的配置當(dāng)然也很簡單。下面的代碼節(jié)選自 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>有關(guān)在 WebLogic Server 上如何實(shí)現(xiàn) MDP 的更詳細(xì)的討論,請參見這里。
JPA 和 AOP 配置
我們已經(jīng)定義了一個 Web 服務(wù)層,它允許我們在 RMI、Spring HTTP 調(diào)用程序、Hessian/Burlap 和 JAXPRC 之間輕松切換 Web 服務(wù)實(shí)現(xiàn)。調(diào)用遠(yuǎn)程服務(wù)時,如果想要使用一種可序列化的機(jī)制傳遞對象,那么這些對象本身必須可序列化。遺憾的是,OpenJPA 的 Find 結(jié)果是一個私有的列表實(shí)現(xiàn),不支持 Serializable,所以我們需要將這些列表與一些更合適的列表綁定,如 Java SE 集合庫的 ArrayList 或 LinkedList。我們可以使用 spring aop 來幫助我們實(shí)現(xiàn),而不必修改應(yīng)用程序源代碼:
@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() {}}以下是相關(guān)聯(lián)的 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);}}}下面的代碼節(jié)選自 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 管理擴(kuò)展
Java 管理擴(kuò)展 (JMX) 是用于監(jiān)視和管理 Java 應(yīng)用程序的規(guī)范。它允許一般的管理系統(tǒng)監(jiān)視應(yīng)用程序,當(dāng)應(yīng)用程序需要注意時發(fā)出通知,并修改應(yīng)用程序狀態(tài)以補(bǔ)救問題。Spring 提供廣泛的 JMX 支持,包括通過 Spring 的 MBeanServerConnectionFactoryBean 公開 WebLogic Server 的 MBeanServer 的能力。 MBeanServerConnectionFactoryBean 是一個方便的工廠,附帶一個 MBeanServerConnection。 在應(yīng)用程序部署期間,建立連接并進(jìn)行緩存,供以后引用 bean 進(jìn)行操作。
可以將 MBeanServerConnectionFactoryBean 配置為返回 WebLogic Server 的 Runtime MBean Server,公開特定的 WebLogic Server 實(shí)例的監(jiān)視、運(yùn)行時控制和活動配置。這包括訪問 WebLogic Server Diagnostics Framework。 此外,Runtime MBean 為當(dāng)前服務(wù)器提供 runtime MBean 和活動配置 MBean 的訪問。
還可以配置 MBeanServerConnectionFactoryBean 以獲得到 WebLogic Server 的Domain Runtime MBean Server 的連接。Domain Runtime MBean Server 提供域范圍內(nèi)服務(wù)的訪問,如應(yīng)用程序部署、JMS 服務(wù)器和 JDBC 數(shù)據(jù)源。它還是訪問域中所有服務(wù)器的所有 runtime MBean 和活動配置 MBean 的層次結(jié)構(gòu)的單點(diǎn)。這個 MBean Server 也是訪問被管理服務(wù)器上的 MBean 的單點(diǎn)。
此外,可以配置 MBeanServerConnectionFactoryBean 以獲取與 WebLogic Server 的 Edit MBean Server 的連接。Edit MBean Server 提供管理當(dāng)前 WebLogic Server 域配置的入口點(diǎn)。
注意,在部署期間,WebLogic Server 的 Domain Runtime MBean Server 不是活動的。所以,bean 需要使用 Spring 的延遲初始化進(jìn)行配置,它會在調(diào)用 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>有關(guān)更多信息,請參見 Understanding WebLogic Server MBeans 和 Spring 的 JMX Support。
支持
從 WebLogic Server 9.0 和 Spring 1.2.5 開始,BEA 就為 Spring Framework on WebLogic Server 提供了支持和認(rèn)證。這種支持不僅是測試 WebLogic Server 上的 Spring 庫的健全性,還致力于 BEA 和 Interface 21(Spring Framework 的創(chuàng)建者和維護(hù)者)之間的積極努力和協(xié)作。我們不但測試了上面所講的 Spring 2.0 的所有特性和配置,一些新特性還直接作為 BEA 和 Interface 21 的協(xié)作成果引入 Spring 2.0。
下載
Spring Open Source Framework Support 2.0 下載包括 Spring 2.0(已在 WebLogic Server 9.2 上經(jīng)過認(rèn)證)和 Spring-JMX 控制臺擴(kuò)展以及利用 Spring 2.0 Framework 重新編寫的 WebLogic Medical Records 示例程序。
未來的工作
今后,我們計(jì)劃提供 WebLogic Server 和 Spring Framework 之間更深層次的集成。盡管我們有了一些想法,但其中最令人感興趣的是:
-
Spring 部署單元: Spring 應(yīng)用程序通常被部署為 webapp,但今后為 Spring 應(yīng)用程序提供專用部署單元是可能的。
-
Spring 安全性和 WebLogic Server 安全性集成: Spring 安全性是 Spring 的安全框架,我們計(jì)劃將它與 WebLogic Server 的企業(yè)級安全框架集成。
總結(jié)
我們用了一些時間討論了 Spring、WebLogic Server 以及這兩種技術(shù)的集成。如我們所展示的那樣,WebLogic Server 提高了應(yīng)用程序的服務(wù)質(zhì)量,Spring 則提高了開發(fā)人員的生產(chǎn)力。這兩種技術(shù)都是高度非侵入性的,允許您專注于應(yīng)用程序的業(yè)務(wù)功能的開發(fā),而不是糾纏于特定于技術(shù)的 API 的錯綜復(fù)雜性。
總結(jié)
以上是生活随笔為你收集整理的Spring 2.0.1 与 BEA WebLogic Server 9.2 的集成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse安装SVN插件方式简明介绍
- 下一篇: 使用Eclipse构建Maven的Spr