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