基于Spring框架的WebSphere應用開(kāi)發(fā)![]() |
![]() | 級別: 初級 偉 方國 (fangguow@cn.ibm.com), IBM軟件部工程師 2006 年 3 月 13 日 本文首先介紹使用Spring開(kāi)發(fā)Web應用的基本問(wèn)題,然后結合WebSphere應用服務(wù)器,講述Spring應用如何結合容器提供的服務(wù)。 輕量級的企業(yè)應用開(kāi)發(fā)越來(lái)越受到廣大J2EE應用開(kāi)發(fā)者的追捧,而Spring框架又是輕量級容器的杰出代表。由于Spring的使用日漸廣泛,因此已有許多基于WebSphere應用服務(wù)器(WAS)的應用采用了Spring框架。本文首先介紹使用Spring開(kāi)發(fā)Web應用的基本問(wèn)題,然后結合WebSphere應用服務(wù)器,講述Spring應用如何結合容器提供的服務(wù)。文章目的是與大家一起探討如何更好的采用Spring框架開(kāi)發(fā)基于WebSphere應用服務(wù)器的應用。
Spring框架的核心思想我們可以用兩個(gè)字來(lái)描述,那就是"解耦"。應用程序的各個(gè)部分之間(包括代碼內部和代碼與平臺之間)盡量形成一種松耦合的結構,使得應用程序有更多的靈活性。應用內部的解耦主要通過(guò)一種稱(chēng)為控制反轉(IOC)的技術(shù)來(lái)實(shí)現??刂品崔D的基本思想就是本來(lái)由應用程序本身來(lái)主動(dòng)控制的調用等邏輯轉變成由外部配置文件來(lái)被動(dòng)控制。通常我們用一個(gè)所謂的好萊塢原則(Don't call me. I will call you.)來(lái)比喻這種控制反轉的關(guān)系。由于控制反轉的概念相對比較廣泛,很多應用服務(wù)器實(shí)際上也實(shí)現了不同程度的控制反轉技術(shù),只是這些應用服務(wù)器對應用程序的侵入性太強。因此Martin Fowler專(zhuān)門(mén)寫(xiě)了一篇文章討論控制反轉這個(gè)概念,并提出一個(gè)描述更為準確的概念,叫依賴(lài)注入(Dependency Injection)。關(guān)于依賴(lài)注入具體可以參考Martin Fowler原文,見(jiàn)參考資料1。Spring框架中的各個(gè)部分都充分使用了這種依賴(lài)注入的技術(shù)實(shí)現,從而給應用以最大的靈活度。實(shí)際上,這種依賴(lài)注入的參數化應用控制并不是Spring的首創(chuàng ),比如IBM的多渠道應用整合平臺(Branch Transformation Toolkit,BTT)很早就采用了這種外部參數化控制的技術(shù)。BTT中的"對象工廠(chǎng)"與Spring框架中的BeanFactory也有著(zhù)異曲同工之妙。 Spring框架另外一個(gè)比較重要的技術(shù)是它對于面向切面的編程(AOP)的支持。隨著(zhù)應用復雜度的逐漸上升和對應用靈活性要求的提高,IT邏輯和業(yè)務(wù)邏輯盡量分離的呼聲也越來(lái)越高。AOP技術(shù)作為實(shí)現這種分離的一種比較好的途徑而越來(lái)越受到大家的重視。Spring提供的是一種動(dòng)態(tài)AOP實(shí)現,也即通過(guò)代理模式動(dòng)態(tài)地在目標對象的方法前后插入相應的處理代碼。應用程序與底層應用服務(wù)器平臺的解耦也可以借助AOP技術(shù)來(lái)實(shí)現。Spring內置的AOP支持是一種錦上添花的功能。它使得一些本來(lái)必須由容器支持的功能,比如事務(wù)控制可以脫離開(kāi)容器運行,從而達到"瘦身"的目的。這也是為什么Spring框架常被人成為輕量級容器的一個(gè)原因。 Spring框架可以與許多已有的框架技術(shù)結合使用。J2EE技術(shù)應用的一個(gè)重要特點(diǎn)是相關(guān)的開(kāi)源社區非?;钴S。Web應用的不同層次都有非常多優(yōu)秀的開(kāi)源框架存在。比如Web層的Struts,OR映射層的Hibernate等。Spring框架并不重新發(fā)明輪子,它的出現不是為了替代這些已有的框架。相反,Spring框架在設計上可以獨立構建應用或者結合已有的框架一起構建應用。另外一個(gè)值得指出的地方是Spring框架的幾大模塊之間相互耦合度很小,因此Spring框架的使用可以根據實(shí)際需要選其部分模塊循序漸進(jìn)的使用,而非必須統統照搬。
Web應用一般在邏輯上根據功能分為以下幾層: 1. 展示層 這一層主要如何生成展示給最終用戶(hù)的界面,盡可能少的包含業(yè)務(wù)邏輯處理。對于基于J2EE的Web應用,JSP是其最為常見(jiàn)的一種技術(shù)。Spring對于展示層的支持非常靈活,除了直接支持JSP之外,它還支持基于FreeMarker模板,基于Velocity模板或其它文檔類(lèi)型的界面等的表現層實(shí)現。 2. 業(yè)務(wù)層 業(yè)務(wù)層一般包含主要的業(yè)務(wù)邏輯,尤其是與用例相對應的那些業(yè)務(wù)邏輯。另外,這一層也適合包含事務(wù)管理和安全控制方面的邏輯。良好的業(yè)務(wù)層設計可以使得展示層可以采用不同的技術(shù)而不影響業(yè)務(wù)層。業(yè)務(wù)層的功能上可以類(lèi)比于J2EE技術(shù)中的無(wú)狀態(tài)會(huì )話(huà)BEAN層次。 3. 數據訪(fǎng)問(wèn)對象(DAO)接口層 DAO實(shí)際上就是數據接口層,在應用中建議通過(guò)接口來(lái)體現。DAO的存在使得數據訪(fǎng)問(wèn)可以與底層持久化層的具體實(shí)現相分離。一般在DAO接口中主要就是實(shí)現數據對象的查詢(xún)、存儲、刪除等操作。從理論上講,DAO層與底層數據的存儲方式是獨立的,也就是說(shuō)并不一定要求是關(guān)系型數據庫。Spring框架在設計的時(shí)候也考慮到了其它非關(guān)系型數據庫數據源的情況。 4. 持久業(yè)務(wù)對象 持久業(yè)務(wù)對象是問(wèn)題域中業(yè)務(wù)對象的持久化表示,比如一個(gè)用戶(hù)對象,一個(gè)銀行帳戶(hù)等。我們一般通過(guò)某種O/R映射技術(shù)來(lái)實(shí)現這些業(yè)務(wù)對象的持久化。持久業(yè)務(wù)對象是可以包含業(yè)務(wù)邏輯的,與業(yè)務(wù)層所包含的業(yè)務(wù)邏輯不同的地方是持久業(yè)務(wù)對象所包含的是與具體業(yè)務(wù)對象直接相關(guān)且更為通用的業(yè)務(wù)邏輯。 5. 企業(yè)信息系統 企業(yè)信息系統泛指Web應用需要連接的后臺系統,一般可以分為三大類(lèi),即ERP系統,企業(yè)傳統的遺留系統和關(guān)系型數據庫。大部分Web應用都是基于關(guān)系型數據庫的,這也是像Spring等常見(jiàn)框架所主要考慮的企業(yè)信息系統。 設計良好的Web應用在層次一般是上一層依賴(lài)下一層,但是下一層不依賴(lài)上一層。我們可以暫時(shí)概括為"向下而不向上依賴(lài)原則"。為了使得不同層次之間的依賴(lài)降到最低,建議使用接口耦合。這一點(diǎn)又是Spring框架發(fā)揮它外部配置優(yōu)勢的地方。 雖然說(shuō)MVC這種模式早在Java語(yǔ)言出現前就有了,但是這種模式在J2EE時(shí)代才大行其道,為廣大Web應用開(kāi)發(fā)者所接受。對于各種基于MVC的框架而言,其要解決的問(wèn)題主要可以分為以下幾部分: 1. 將Web頁(yè)面中的輸入封裝成一個(gè)數據對象,比如像Struts的表單BEAN,Spring MVC中的命令類(lèi)等。 2. 根據請求的不同,由負責分發(fā)的控制器來(lái)映射和調用相應的邏輯處理單元,并將上面的數據對象作為參數傳入。 3. 邏輯處理單元完成相應的處理之后又把結果放入一個(gè)數據對象。 4. 在選擇的展現界面中把返回的數據對象通過(guò)某種方式顯示出來(lái)。 在使用Spring構建MVC的時(shí)候,可以選擇直接使用Spring自己的MVC實(shí)現,或者利用Spring對已有的一些MVC框架的支持。比如Spring可以支持Struts,WebWork等,與它們結合使用。Spring引以為傲的非侵入的特性在Spring MVC上表現得并不如人意。它與Servlet API的耦合度較其它部分高,而且需要使用一些Spring的接口和類(lèi)。 Spring MVC的主要分發(fā)器實(shí)現是org.springframework.web.servlet.DispatcherServlet,這是Spring MVC的訪(fǎng)問(wèn)入口。Spring提供SimpleFormController,AbstractCommandController等類(lèi)來(lái)幫助應用構建各種控制器動(dòng)作,并用ModelAndView類(lèi)來(lái)聯(lián)系展示和邏輯返回數據。如上節所述,Spring MVC能夠支持不同的界面展示技術(shù),而且界面的展示和其后面控制器的實(shí)現是分離的,也即界面展示技術(shù)的變化不用修改控制器的實(shí)現,只需要利用Spring的控制反轉技術(shù)修改外部配置文件即可。比如,在使用JSP展示技術(shù)時(shí),外部配置文件的viewResolver定義如下:
如果切換到FreeMaker模板技術(shù),那么除了頁(yè)面模板的修改之外,主要就是把對應的外部配置文件更改一下即可,如下所示。具體的展示邏輯部分不用做什么修改。
如果不使用Spring的MVC框架而想結合已有的一些MVC框架,Spring也是支持的。Spring對于常見(jiàn)的MVC框架都提供了支持,包括Struts,WebWork,Tapestry和JSF等。結合使用這些框架的一個(gè)好處是可以使用一些已有的熟悉的技術(shù),另外結合Spring的AOP攔截器可以相對比較容易地處理框架動(dòng)作共有的事情,比如動(dòng)作的日志處理等。如果選擇這些MVC框架,那么在使用框架的配置文件和應用的Spring配置文件都需要做相應的修改。比如使用Struts的時(shí)候,Struts-config.xml配置文件中的映射動(dòng)作類(lèi)型一般會(huì )設置成org.springframework.web.struts.DelegatingActionProxy,或者設置控制器為org.springframework.web.struts.DelegatingRequestProcessor。然后需要在相應應的WebApplicationContext中定義與Struts Action對應的Bean。這樣就可以充分利用Spring的控制反轉技術(shù)來(lái)管理Struts的Action了。 另外在使用這些框架的時(shí)候要解決的一個(gè)問(wèn)題是上下文的裝載。比如使用Struts,可以使用ContextLoaderPlugin來(lái)裝載Web上下文。這個(gè)ContextLoaderPlugin替換了原來(lái)通過(guò)DispacherServlet裝載的方式。需要在struts-config.xml文件中添加如下條目:<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>。這種方式可以使Spring的Web上下文隨著(zhù)Struts ActionServlet的初始化而裝載。 因此,如果用戶(hù)已有的應用是基于某個(gè)MVC框架,或者用戶(hù)熟悉某個(gè)框架,那么可以利用Spring對這些框架的支持結合使用。因為我們的目的本來(lái)就是為了解決問(wèn)題而不是為了使用某種技術(shù)。但是對其它用戶(hù)而言,如果不是對已有的一些MVC框架比較熟悉的話(huà),那就直接使用Spring的MVC框架就可以了。 對于不依賴(lài)于應用服務(wù)器的Spring 上下文(Context)設置,通常在應用代碼中通過(guò)FileSystemXmlApplicationContext或ClasspathXmlApplicationContext來(lái)獲取。比如使用這樣的代碼來(lái)得到上下文:
但是按照控制反轉的原則,應用程序代碼應該盡可能少的知道上下文的設置。因此,在基于Spring的Web應用中,這樣的代碼也可以省去。Spring可以通過(guò)配置讓W(xué)eb容器自動(dòng)裝載上下文配置文件。從本質(zhì)上講,Web應用的ServletContext就是Spring用來(lái)存放應用上下文的地方。Spring中與Web Context裝載相關(guān)的有幾個(gè)類(lèi): 1. ContextLoaderListener:一般的應用服務(wù)器如WAS都能先裝載Listener,如果不是的話(huà),那么只能使用ContextLoaderServlet。 2. ContextLoaderServlet:需要配置<load-on-startup>使得它率先裝載。真正裝載Context的類(lèi)是ContextLoader,上面兩個(gè)類(lèi)只是兩種調用ContextLoader的不同途徑。ContextLoader內部實(shí)際調用的是XmlWebApplicationContext,其缺省配置文件為/WEB-INF/applicationContext.xml。 如果使用ContextLoaderListener,其在web.xml中的配置一般如下:
如果使用ContextLoaderServlet,其在web.xml中的配置一般如下:
應用本身可能除了基于HTTP的Web渠道之外還通過(guò)別的渠道對外提供服務(wù),因此,一個(gè)比較好的做法是把展示相關(guān)的配置與后面業(yè)務(wù)處理部分的配置分開(kāi)。這樣如果更改了應用的訪(fǎng)問(wèn)渠道,只需要修改對應的配置文件即可。因此,Spring提供了一個(gè)WebApplicationContext的概念。在WebApplicationContext中一般包含與Web訪(fǎng)問(wèn)相關(guān)的配置定義,包括各種控制動(dòng)作的定義、界面展示的定義等等。WebApplicationContext一般由DispatcherServlet來(lái)初始化。在上下文層次結構上可以把它看成是ApplcationContext的子上下文。在缺省的情況下,DispatcherServlet裝載的配置文件名稱(chēng)為其Servlet名稱(chēng)-Servlet.xml,但是可以通過(guò)contextConfigLocation參數來(lái)定制。DispatcherServlet在web.xml中的定義示例如下:
雖然使用J2EE技術(shù)的Web應用可以連接多種不同的企業(yè)信息系統(EIS),但是毫無(wú)疑問(wèn)數據庫是其中最為重要和常見(jiàn)的一種。正因如此,Spring對數據庫訪(fǎng)問(wèn)提供了非常完備的支持。數據訪(fǎng)問(wèn)對象(DAO)模式是J2EE模式中非常重要的一種。它的主要目的是使得持久化層與業(yè)務(wù)邏輯層分離,從而屏蔽持久化層的具體實(shí)現。我們可以把Spring的DAO支持分為兩大類(lèi),一是直接基于Spring JDBC模板的數據訪(fǎng)問(wèn),另一類(lèi)是基于某種O/R映射框架的數據訪(fǎng)問(wèn)。這里剛好可以使用Spring的控制反轉特性,通過(guò)外部配置文件來(lái)定義DAO接口和實(shí)際實(shí)現類(lèi)之間的關(guān)系。Spring框架目前支持的O/R映射框架包括Hibernate、JDO、TopLink、iBATIS等。 假設我們定義了一個(gè)userDAO。當使用JDBC來(lái)實(shí)現這個(gè)DAO的時(shí)候,定義的類(lèi)可以如下所示:
如果使用Hibernate來(lái)實(shí)現這個(gè)DAO的時(shí)候,定義的類(lèi)如下:
Spring對于其它的O/R映射機制都有相應的抽象類(lèi)供應用使用,比如對于iBATIS有SqlMapClientDaoSupport,對于JDO有JdoDaoSupport等。 下面我們看一下如何在Spring的配置文件中定義上述DAO與具體實(shí)現的關(guān)系。假設我們的userDAO具體實(shí)現是通過(guò)Hibernate,那么在applicationContext.xml中的一個(gè)DAO可以定義如下:
在這里我們實(shí)際DAO接口定義是:com.fgw.dao.UserDAO,而具體實(shí)現類(lèi)為:com.fgw.dao.hibernate.UserDAOHibernate。顯然,對于其它DAO的實(shí)現,我們只需要在配置文件中修改相應的實(shí)現類(lèi)(具體實(shí)現類(lèi)當然是比不可少的)和屬性即可。比如對于JDBC的DAO實(shí)現,屬性就定義成相應的數據源。
1.3 Spring與WebSphere應用服務(wù)器的配合 Spring與底層J2EE應用服務(wù)器還是存在一些需要結合的地方,這里給出WAS中的一些結合點(diǎn)。 在Java應用程序中,數據庫的連接一般有兩種方式來(lái)得到。一種是通過(guò)java.sql.DriverManager的方式來(lái)得到數據庫連接。這種方式不依賴(lài)于應用服務(wù)的支持,但是也不提供數據庫連接池的功能。另外一種方式是通過(guò)javax.sql.DataSource的方式來(lái)得到數據庫連接。在傳統基于J2EE的應用需要通過(guò)JNDI來(lái)得到數據源(javax.sql.DataSource)對象,然后再通過(guò)數據源來(lái)得到相應的數據庫連接。常見(jiàn)的應用服務(wù)器都支持這種方式,且一般都提供了數據庫連接池的支持。雖然說(shuō)我們一般推薦使用數據庫連接池,但是也有一些時(shí)候我們需要脫離開(kāi)應用服務(wù)器的環(huán)境使用數據庫(比如單元測試,比如應用移植等)。然而應用程序使用這兩種方式的時(shí)候代碼是不一樣的,因此只能通過(guò)代碼來(lái)應變。Spring提供了一個(gè)統一使用數據源的解決方案,然后通過(guò)控制反轉的機制用外部配置文件來(lái)指定使用的數據源。這樣一方面可以統一這兩種得到數據庫連接的方式,另一方面也不需要像通常的J2EE應用通過(guò)繁瑣的JNDI代碼來(lái)得到數據源。這樣應用程序也就不需要知道使用的何種數據源。 Spring提供了一個(gè)DriverManagerDataSource類(lèi)來(lái)統一第一種方式的數據源獲取。如果使用WAS中的Cloudscape數據庫,用外部配置文件可配置如下:
Spring提供了JndiObjectFactoryBean類(lèi)來(lái)支持第二種方式的數據源獲取。假設WAS中已經(jīng)配置好的數據源名稱(chēng)為jdbc /MyDB,那么用外部配置文件可配置如下:
從上面配置我們可以得知,通過(guò)使用Spring,應用程序能夠統一使用不同的數據源實(shí)現。如果使用環(huán)境發(fā)生變化,那么只需要修改Spring的配置文件即可。對于部署在WAS上的Web應用,在生產(chǎn)環(huán)境中推薦使用WAS實(shí)現的數據庫連接池。一方面是因為連接池實(shí)現地比較完善。另一方面,使用WAS提供的數據庫連接池可以很完善地支持JTA事務(wù)。 Web應用程序在使用事務(wù)的時(shí)候常常會(huì )涉及一個(gè)事務(wù)類(lèi)型的選擇。是選擇像JDBC事務(wù)這樣的本地事務(wù)呢還是使用JTA支持的全局事務(wù)。這個(gè)與應用程序需要涉及到的事務(wù)管理器類(lèi)型和個(gè)數密切相關(guān)。Spring本身不支持分布式事務(wù),因此分布式事務(wù)需要底層的JTA。但是Spring提供了事務(wù)的抽象,即底層真正事務(wù)實(shí)現可以切換而不影響應用程序代碼。這樣應用程序可以依賴(lài)于底層WAS,也可以輕易地脫離開(kāi)應用服務(wù)器的環(huán)境。這一點(diǎn)與前面數據源的抽象非常類(lèi)似。 WAS本身對于事務(wù)劃分有兩種支持方式,一種是聲明式的,當然這種管理方式需要EJB容器的支持,即所謂的容器管理事務(wù)(CMT)。另外一種方式是編程式的,通過(guò)程序代碼來(lái)直接使用JTA編程接口。Spring對于事務(wù)的劃分也可以分為聲明式和編程式兩種方式。對于Spring編程式的事務(wù)劃分方式,總體上可以分為兩大類(lèi)。一類(lèi)是通過(guò)直接使用實(shí)現PlatformTransactionManager接口的類(lèi)。另一類(lèi)是通過(guò)使用TransactionTemplate模板類(lèi),模板類(lèi)的使用可以簡(jiǎn)化事務(wù)控制代碼。Spring對于聲明式事務(wù)劃分的支持實(shí)際上是利用了它的AOP機制。相對于編程式事務(wù)劃分,這種基于A(yíng)OP的方式比較靈活,而且對代碼的侵入性幾乎為零。因此,如果沒(méi)有特殊需要推薦使用這種事務(wù)劃分方式?;贏(yíng)OP的常用事務(wù)劃分方式可以使用ProxyFactoryBean加TransactionInterceptor方式,或者使用TransactionPorxyFactoryBean的方式。前一種方式相對比較靈活,而后一種則對使用相對比較簡(jiǎn)單。 無(wú)論是哪一種事務(wù)劃分方式,底層都需要一個(gè)事務(wù)管理機制作為支撐。如果是單一的事務(wù)資源管理器,那么根據所使用的后臺事務(wù)管理資源不同的類(lèi)型,可以選擇的PlatformTransactionManager實(shí)現有DataSourceTransactionManager,HibernateTransactionManager, JdoTransactionManager, PersistenceBrokerTransactionManager,和JmsTransactionManager等。無(wú)論是單個(gè)還是多個(gè)事務(wù)資源管理器,都可以使用JtaTransactionManager類(lèi)。如果使用JtaTransactionManager,那么所有事務(wù)管理實(shí)際都會(huì )委托給底層應用服務(wù)器的JTA實(shí)現。 例如,如果使用JDBC或iBATIS,那么我們可以使用簡(jiǎn)單的DataSourceTransactionManager,外部配置文件片斷如下:
如果使用Hibernate,那么我們可以使用HibernateTransactionManager,外部配置文件片斷如下:
使用WAS的JTA支持,我們只需要把上述對應bean中的class屬性改成class屬性改為org.springframework.transaction.jta.JtaTransactionManager,然后再把屬性改為WebSphere對應的TransactionManager,參考如下:
通過(guò)采用Spring的事務(wù)支持,底層事務(wù)采用何種方式的決定就不必在一開(kāi)始開(kāi)發(fā)就做出決定。因為我們能夠通過(guò)Spring的外部配置文件來(lái)進(jìn)行切換真正的事務(wù)支持。不過(guò),雖然也有第三方的JTA支持,但是WAS能夠提供非常穩定的XA支持,因此推薦使用WAS的JTA,尤其是當應用涉及到分布事務(wù)處理的時(shí)候。這樣無(wú)論應用涉及幾個(gè)事務(wù)資源都可以統一解決。 Spring框架的核心JAR包是spring.jar,但是根據實(shí)際使用情況需要一些擴展JAR包和依賴(lài)JAR包。那在WAS中如何處理這些JAR包文件呢?在Web應用中一個(gè)簡(jiǎn)單而直接的處理方式放是把這些使用到的JAR文件都拷貝到對應的WEB-INF/lib目錄下面。這種方法雖然簡(jiǎn)單,但是當有多個(gè)Spring應用程序的時(shí)候這種處理方式就需要在每個(gè)應用的WEB-INF/lib目錄下都拷貝一份相同的JAR文件。這里可以通過(guò)共享庫的方式來(lái)統一解決類(lèi)庫共享這個(gè)問(wèn)題。 共享庫就是WAS專(zhuān)門(mén)用來(lái)解決不同應用程序之間共享JAR或本地庫文件的一種機制。共享庫由一個(gè)名字、一個(gè)JAVA類(lèi)路徑和/或一個(gè)裝載JNI庫本地庫路徑組成。它可以分別在單元,節點(diǎn)和服務(wù)器級別定義。但是共享庫定義了并不意味著(zhù)它會(huì )被裝載,只有當這個(gè)共享庫與某個(gè)應用程序或應用服務(wù)器關(guān)聯(lián)之后,它才會(huì )被加載。如果一個(gè)共享庫與一個(gè)應用程序關(guān)聯(lián),那么這個(gè)共享庫由應用程序類(lèi)加載器加載。如果一個(gè)共享庫與應用服務(wù)器關(guān)聯(lián),那么這個(gè)共享庫就需要一個(gè)專(zhuān)門(mén)定義的類(lèi)加載器來(lái)加載。這個(gè)類(lèi)加載器需要用戶(hù)自己定義。其操作如下:選應用服務(wù)器比如server1'類(lèi)加載器'新建一個(gè)類(lèi)加載器'加載器與共享庫關(guān)聯(lián)。在創(chuàng )建這個(gè)類(lèi)加載器之前一般都需要預先定義好共享庫。 根據上面的介紹可知,通過(guò)共享庫解決Spring應用的JAR包共享問(wèn)題,主要就是兩個(gè)步驟。一是,把Spring應用中需要共享的JAR包定義成為一個(gè)共享庫。二是,選定相應的WAS服務(wù)器實(shí)例,把它與上面創(chuàng )建的共享庫關(guān)聯(lián)起來(lái)。這樣此WAS服務(wù)器實(shí)例上的所有應用都能夠使用共享庫中定義的JAR包。使用共享庫這種方式的時(shí)候要注意理解類(lèi)的裝載次序和方式。如果是這種與WAS服務(wù)器實(shí)例關(guān)聯(lián)的共享庫JAR包,其類(lèi)加載器在層次結構上在應用程序類(lèi)加載器上面,即是它的父加載器。關(guān)于WAS的類(lèi)裝載器結構和策略可以進(jìn)一步參考WAS信息中心。
Spring框架的核心內容并不依賴(lài)于任何容器,但是顯然基于Web的應用是Spring主要的應用類(lèi)型。了解和使用Spring框架一方面可以簡(jiǎn)化應用的開(kāi)發(fā)和測試,另一方也可以加深對J2EE技術(shù)的理解。另外輕量級的Web應用開(kāi)發(fā)正在成為一種趨勢,因此何樂(lè )而不為之。上面所討論的只是Spring使用中常見(jiàn)的一些內容,Spring框架自己也正變得越來(lái)越復雜。當然,Spring、Hibernate等框架中體現的一些思想也正被JEE 5規范所借鑒,尤其是EJB 3中也有了控制反轉的應用和POJO的大量使用。實(shí)際上無(wú)論是JEE技術(shù)標準還是Spring等框架,其目的都是如何簡(jiǎn)化企業(yè)應用的開(kāi)發(fā),只是作為標準,JEE要考慮的內容更為廣泛一些,程度也更為深入一些。 |
聯(lián)系客服