基於Spring框架的WebSphere套用開發1

  本文首先介紹使用spring開發web套用的基本問題,然後結合websphere套用伺服器,講述spring套用如何結合容器提供的服務。 概覽

輕量級的企業套用開發越來越受到廣大j2ee套用開發者的追捧,而spring框架又是輕量級容器的傑出代表。由於spring的使用日漸廣泛,因此已有許多基於websphere套用伺服器(was)的套用採用了spring框架。本文首先介紹使用spring開發web套用的基本問題,然後結合websphere套用伺服器,講述spring套用如何結合容器提供的服務。文章目的是與大家一起探討如何更好的採用spring框架開發基於websphere套用伺服器的套用。

spring框架的主要思想描述

spring框架的核心思想我們可以用兩個字來描述,那就是"解耦"。應用程式的各個部分之間(包括代碼內部和代碼與平台之間)儘量形成一種松耦合的結構,使得應用程式有更多的靈活性。套用內部的解耦主要通過一種稱為控制反轉(ioc)的技術來實現。控制反轉的基本思想就是本來由應用程式本身來主動控制的調用等邏輯轉變成由外部配置檔案來被動控制。通常我們用一個所謂的好萊塢原則(don't call me. i will call you.)來比喻這種控制反轉的關係。由於控制反轉的概念相對比較廣泛,很多套用伺服器實際上也實現了不同程度的控制反轉技術,只是這些套用伺服器對應用程式的侵入性太強。因此martin fowler專門寫了一篇文章討論控制反轉這個概念,並提出一個描述更為準確的概念,叫依賴注入(dependency injection)。關於依賴注入具體可以參考martin fowler原文,見參考資料1。spring框架中的各個部分都充分使用了這種依賴注入的技術實現,從而給套用以最大的靈活度。實際上,這種依賴注入的參數化套用控制並不是spring的首創,比如ibm的多渠道套用整合平台(branch transformation toolkit,btt)很早就採用了這種外部參數化控制的技術。btt中的"對象工廠"與spring框架中的beanfactory也有著異曲同工之妙。

spring框架另外一個比較重要的技術是它對於面向切面的編程(aop)的支持。隨著套用複雜度的逐漸上升和對套用靈活性要求的提高,it邏輯和業務邏輯儘量分離的呼聲也越來越高。aop技術作為實現這種分離的一種比較好的途徑而越來越受到大家的重視。spring提供的是一種動態aop實現,也即通過代理模式動態地在目標對象的方法前後插入相應的處理代碼。應用程式與底層套用伺服器平台的解耦也可以藉助aop技術來實現。spring內置的aop支持是一種錦上添花的功能。它使得一些本來必須由容器支持的功能,比如事務控制可以脫離開容器運行,從而達到"瘦身"的目的。這也是為什麼spring框架常被人成為輕量級容器的一個原因。

spring框架可以與許多已有的框架技術結合使用。j2ee技術套用的一個重要特點是相關的開源社區非常活躍。web套用的不同層次都有非常多優秀的開源框架存在。比如web層的struts,or映射層的hibernate等。spring框架並不重新發明輪子,它的出現不是為了替代這些已有的框架。相反,spring框架在設計上可以獨立構建套用或者結合已有的框架一起構建套用。另外一個值得指出的地方是spring框架的幾大模組之間相互耦合度很小,因此spring框架的使用可以根據實際需要選其部分模組循序漸進的使用,而非必須統統照搬。

基於spring的web套用基礎

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框架發揮它外部配置優勢的地方。

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定義如下:

<bean id="viewresolver" class="org.springframework.web.servlet.view.internalresourceviewresolver"> <property> <value>org.springframework.web.servlet.view.jstlview</value> </property> <property><value>/view/</value></property> <property><value>.jsp</value></property> </bean>
如果切換到freemaker模板技術,那么除了頁面模板的修改之外,主要就是把對應的外部配置檔案更改一下即可,如下所示。具體的展示邏輯部分不用做什麼修改。