下一頁 1 2 3
概覽
輕量級的企業應用開發越來越受到廣大J2EE應用開發者的追捧,而Spring框架又是輕量級容器的杰出代表。由于Spring的使用日漸廣泛,因此已有許多基于WebSphere應用服務器(WAS)的應用采用了Spring框架。
本文首先介紹使用Spring開發Web應用的基本問題,然后結合WebSphere應用服務器,講述Spring應用如何結合容器提供的服務。文章目的是與大家一起探討如何更好的采用Spring框架開發基于WebSphere應用服務器的應用。
1、Spring框架的主要思想描述
Spring框架的核心思想我們可以用兩個字來描述,那就是"解耦"。應用程序的各個部分之間(包括代碼內部和代碼與平臺之間)盡量形成一種松耦合的結構,使得應用程序有更多的靈活性。應用內部的解耦主要通過一種稱為控制反轉(IOC)的技術來實現??刂品崔D的基本思想就是本來由應用程序本身來主動控制的調用等邏輯轉變成由外部配置文件來被動控制。通常我們用一個所謂的好萊塢原則(Don't call me. I will call you.)來比喻這種控制反轉的關系。由于控制反轉的概念相對比較廣泛,很多應用服務器實際上也實現了不同程度的控制反轉技術,只是這些應用服務器對應用程序的侵入性太強。因此Martin Fowler專門寫了一篇文章討論控制反轉這個概念,并提出一個描述更為準確的概念,叫依賴注入(Dependency Injection)。
Spring框架中的各個部分都充分使用了這種依賴注入的技術實現,從而給應用以最大的靈活度。實際上,這種依賴注入的參數化應用控制并不是Spring的首創,比如IBM的多渠道應用整合平臺(Branch Transformation Toolkit,BTT)很早就采用了這種外部參數化控制的技術。BTT中的"對象工廠"與Spring框架中的BeanFactory也有著異曲同工之妙。
Spring框架另外一個比較重要的技術是它對于面向切面的編程(AOP)的支持。隨著應用復雜度的逐漸上升和對應用靈活性要求的提高,IT邏輯和業務邏輯盡量分離的呼聲也越來越高。AOP技術作為實現這種分離的一種比較好的途徑而越來越受到大家的重視。Spring提供的是一種動態AOP實現,也即通過代理模式動態地在目標對象的方法前后插入相應的處理代碼。應用程序與底層應用服務器平臺的解耦也可以借助AOP技術來實現。Spring內置的AOP支持是一種錦上添花的功能。它使得一些本來必須由容器支持的功能,比如事務控制可以脫離開容器運行,從而達到"瘦身"的目的。這也是為什么Spring框架常被人成為輕量級容器的一個原因。
Spring框架可以與許多已有的框架技術結合使用。J2EE技術應用的一個重要特點是相關的開源社區非?;钴S。Web應用的不同層次都有非常多優秀的開源框架存在。比如Web層的Struts,OR映射層的Hibernate等。Spring框架并不重新發明輪子,它的出現不是為了替代這些已有的框架。相反,Spring框架在設計上可以獨立構建應用或者結合已有的框架一起構建應用。另外一個值得指出的地方是Spring框架的幾大模塊之間相互耦合度很小,因此Spring框架的使用可以根據實際需要選其部分模塊循序漸進的使用,而非必須統統照搬。
2、基于Spring的Web應用基礎
2.1 Web應用的典型層次
Web應用一般在邏輯上根據功能分為以下幾層:
1.展示層
這一層主要如何生成展示給最終用戶的界面,盡可能少的包含業務邏輯處理。對于基于J2EE的Web應用,JSP是其最為常見的一種技術。Spring對于展示層的支持非常靈活,除了直接支持JSP之外,它還支持基于FreeMarker模板,基于Velocity模板或其它文檔類型的界面等的表現層實現。
2.業務層
業務層一般包含主要的業務邏輯,尤其是與用例相對應的那些業務邏輯。另外,這一層也適合包含事務管理和安全控制方面的邏輯。良好的業務層設計可以使得展示層可以采用不同的技術而不影響業務層。業務層的功能上可以類比于J2EE技術中的無狀態會話BEAN層次。
3.數據訪問對象(DAO)接口層
DAO實際上就是數據接口層,在應用中建議通過接口來體現。DAO的存在使得數據訪問可以與底層持久化層的具體實現相分離。一般在DAO接口中主要就是實現數據對象的查詢、存儲、刪除等操作。從理論上講,DAO層與底層數據的存儲方式是獨立的,也就是說并不一定要求是關系型數據庫。Spring框架在設計的時候也考慮到了其它非關系型數據庫數據源的情況。
4.持久業務對象
持久業務對象是問題域中業務對象的持久化表示,比如一個用戶對象,一個銀行帳戶等。我們一般通過某種O/R映射技術來實現這些業務對象的持久化。持久業務對象是可以包含業務邏輯的,與業務層所包含的業務邏輯不同的地方是持久業務對象所包含的是與具體業務對象直接相關且更為通用的業務邏輯。
5.企業信息系統
企業信息系統泛指Web應用需要連接的后臺系統,一般可以分為三大類,即ERP系統,企業傳統的遺留系統和關系型數據庫。大部分Web應用都是基于關系型數據庫的,這也是像Spring等常見框架所主要考慮的企業信息系統。
設計良好的Web應用在層次一般是上一層依賴下一層,但是下一層不依賴上一層。我們可以暫時概括為"向下而不向上依賴原則"。為了使得不同層次之間的依賴降到最低,建議使用接口耦合。這一點又是Spring框架發揮它外部配置優勢的地方。
2.2 MVC的選擇
雖然說MVC這種模式早在Java語言出現前就有了,但是這種模式在J2EE時代才大行其道,為廣大Web應用開發者所接受。對于各種基于MVC的框架而言,其要解決的問題主要可以分為以下幾部分:
1.將Web頁面中的輸入封裝成一個數據對象,比如像Struts的表單BEAN,Spring MVC中的命令類等。
2.根據請求的不同,由負責分發的控制器來映射和調用相應的邏輯處理單元,并將上面的數據對象作為參數傳入。
3.邏輯處理單元完成相應的處理之后又把結果放入一個數據對象。
4.在選擇的展現界面中把返回的數據對象通過某種方式顯示出來。
在使用Spring構建MVC的時候,可以選擇直接使用Spring自己的MVC實現,或者利用Spring對已有的一些MVC框架的支持。比如Spring可以支持Struts,WebWork等,與它們結合使用。Spring引以為傲的非侵入的特性在Spring MVC上表現得并不如人意。它與Servlet API的耦合度較其它部分高,而且需要使用一些Spring的接口和類。
Spring MVC的主要分發器實現是org.springframework.web.servlet.DispatcherServlet,這是Spring MVC的訪問入口。Spring提供SimpleFormController,AbstractCommandController等類來幫助應用構建各種控制器動作,并用ModelAndView類來聯系展示和邏輯返回數據。如上節所述,Spring MVC能夠支持不同的界面展示技術,而且界面的展示和其后面控制器的實現是分離的,也即界面展示技術的變化不用修改控制器的實現,只需要利用Spring的控制反轉技術修改外部配置文件即可。比如,在使用JSP展示技術時,外部配置文件的viewResolver定義如下:
clearcase/" target="_blank" >cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
<property name="prefix"><value>/view/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
如果切換到FreeMaker模板技術,那么除了頁面模板的修改之外,主要就是把對應的外部配置文件更改一下即可,如下所示。具體的展示邏輯部分不用做什么修改。
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass">
<value>
org.springframework.web.servlet.view.freemarker.FreeMarkerView
</value>
</property>
<property name="suffix"><value>.ftl</value></property>
</bean>
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath">
<value>/view/</value>
</property>
</bean>
如果不使用Spring的MVC框架而想結合已有的一些MVC框架,Spring也是支持的。Spring對于常見的MVC框架都提供了支持,包括Struts,WebWork,Tapestry和JSF等。結合使用這些框架的一個好處是可以使用一些已有的熟悉的技術,另外結合Spring的AOP攔截器可以相對比較容易地處理框架動作共有的事情,比如動作的日志處理等。如果選擇這些MVC框架,那么在使用框架的配置文件和應用的Spring配置文件都需要做相應的修改。比如使用Struts的時候,Struts-config.xml配置文件中的映射動作類型一般會設置成org.springframework.web.struts.DelegatingActionProxy,或者設置控制器為org.springframework.web.struts.DelegatingRequestProcessor。然后需要在相應應的WebApplicationContext中定義與Struts Action對應的Bean。這樣就可以充分利用Spring的控制反轉技術來管理Struts的Action了。
另外在使用這些框架的時候要解決的一個問題是上下文的裝載。比如使用Struts,可以使用ContextLoaderPlugin來裝載Web上下文。這個ContextLoaderPlugin替換了原來通過DispacherServlet裝載的方式。需要在struts-config.xml文件中添加如下條目:<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>。這種方式可以使Spring的Web上下文隨著Struts ActionServlet的初始化而裝載。
因此,如果用戶已有的應用是基于某個MVC框架,或者用戶熟悉某個框架,那么可以利用Spring對這些框架的支持結合使用。因為我們的目的本來就是為了解決問題而不是為了使用某種技術。但是對其它用戶而言,如果不是對已有的一些MVC框架比較熟悉的話,那就直接使用Spring的MVC框架就可以了。
原文轉自:http://www.anti-gravitydesign.com