Spring MVC框架的高級(jí)配置(上)
Spring配置
人們經(jīng)常會(huì)在一臺(tái)以上的主機(jī)上配置一種Web應(yīng)用程序。例如,在生產(chǎn)中,一個(gè)網(wǎng)站可能只有一個(gè)實(shí)例。除了此實(shí)例外,開(kāi)發(fā)人員可以在用于開(kāi)發(fā)的機(jī)器上配置其他的(開(kāi)發(fā))實(shí)例。也可以在公司(機(jī)構(gòu))內(nèi)部的本地開(kāi)發(fā)服務(wù)器上維護(hù)其他應(yīng)用程序裝置,這將讓您受益匪淺。該實(shí)例的目的是使Web設(shè)計(jì)者可以獲得有質(zhì)量保證的材料,并為需要為應(yīng)用程序提供文件資料的人提供準(zhǔn)入。
大家都知道,即使是最簡(jiǎn)單的場(chǎng)景,也需要安裝、配置和維護(hù)三個(gè)實(shí)例。而對(duì)于位于不同地理位置的團(tuán)隊(duì)來(lái)說(shuō),要從事這樣的項(xiàng)目便更加困難。對(duì)于任何不是特別簡(jiǎn)單的Web應(yīng)用程序項(xiàng)目,都需要多名開(kāi)發(fā)人員來(lái)安裝項(xiàng)目裝置和本地設(shè)置以及運(yùn)行單元測(cè)試的裝置等。
很多組織都將自己開(kāi)發(fā)的產(chǎn)品作為Web應(yīng)用程序。我們可以在很多產(chǎn)品中發(fā)現(xiàn)這種情況,例如電子商務(wù)系統(tǒng)、內(nèi)容管理系統(tǒng)(CMS),以及博客發(fā)布平臺(tái)等。這類產(chǎn)品可在多個(gè)服務(wù)器中進(jìn)行部署。對(duì)于成功的多用途W(wǎng)eb應(yīng)用程序來(lái)說(shuō),他們的開(kāi)發(fā)人員必須要保證他們的應(yīng)用程序便于安裝,并且能夠與其他 Web應(yīng)用程序完美集成。經(jīng)過(guò)上述討論之后,我們應(yīng)該明了,作為本文主題的應(yīng)用程序配置是通用Web應(yīng)用程序項(xiàng)目開(kāi)發(fā)人員所需要解決的重要問(wèn)題之一。
諸如CVS或Subversion之類的版本控制系統(tǒng)是開(kāi)發(fā)組織使用的一種標(biāo)準(zhǔn)工具。這種工具代表了一些組織的中心源代碼版本庫(kù),它們被用于保持源代碼的有序。用戶可以跟蹤應(yīng)用程序源代碼的變化,顯示不同版本的區(qū)別,并可以確定項(xiàng)目分支。而且,它們使得在應(yīng)用程序部署中進(jìn)行部分更新成為可能。
很明顯,版本控制系統(tǒng)軟件是跟蹤源代碼所必需的,它對(duì)于解決應(yīng)用程序配置問(wèn)題有非常大的幫助。在本文中,我們將不會(huì)把重點(diǎn)放在版本控制系統(tǒng)上,因?yàn)檫@方面已經(jīng)有很多相關(guān)的材料了。在此,我們將關(guān)注版本控制問(wèn)題中的一個(gè)小話題:如何使Web應(yīng)用程序的配置更加便捷(尤其是使用Spring MVC框架編寫(xiě)的Web應(yīng)用程序)。
問(wèn)題是:我們?cè)诖擞懻摰氖且环N什么樣的配置?任何Web應(yīng)用程序都需要一些資源,這些資源通常都是其所運(yùn)行的服務(wù)器所特有的,例如數(shù)據(jù)庫(kù)URL、發(fā)送電子郵件的SMTP服務(wù)器,以及包含專用軟件文件的文件夾等。這樣的設(shè)置應(yīng)該集中,從而使應(yīng)用程序配置更加簡(jiǎn)單。
但是,這只是這個(gè)問(wèn)題最簡(jiǎn)單的一種版本。有時(shí)候,在應(yīng)用程序開(kāi)發(fā)中需要更加復(fù)雜的配置。這意味著,必須將各次部署中的不同Bean連接起來(lái),而這會(huì)使問(wèn)題更加復(fù)雜。
這些應(yīng)用程序配置問(wèn)題的解決方案有諸多優(yōu)勢(shì),包括:簡(jiǎn)化應(yīng)用程序的安裝和配置過(guò)程,使源代碼版本控制更加簡(jiǎn)便,減少源代碼版本庫(kù)中的沖突現(xiàn)象。下面,我們將通過(guò)示例詳細(xì)討論這個(gè)話題。
問(wèn)題
我們首先來(lái)演示一下上文所提到的最簡(jiǎn)單的版本。在這一場(chǎng)景中,我們希望在應(yīng)用程序部署中改變的是簡(jiǎn)單的配置參數(shù),例如鏈接、密碼等。如果您曾經(jīng)使用Spring MVC框架開(kāi)發(fā)過(guò)Web應(yīng)用程序,那么您應(yīng)該知道這里將用到的兩個(gè)配置文件:
◆/WEB-INF/applicationContext.XML,它讓您可以配置Bean,或者顯示應(yīng)用程序上下文。通過(guò)這個(gè)文件,您可以定義自己的業(yè)務(wù)邏輯Bean、資源以及其他可以與Web端口相關(guān)聯(lián)的所有Bean。
◆/WEB- INF/[Servlet-name]-servlet.xml,它被用于配置Web層、視圖解析器、控制器、校驗(yàn)器以及其他所有MVC框架中必需的 Bean。[servlet-name]指的是在web.xml部署描述符中定義的Spring dispatcher servlet的名稱。
那么問(wèn)題在哪兒呢?問(wèn)題就出在applicationContext.xml中將包括一些特定于主機(jī)的Bean定義。其中,最明顯的一個(gè)示例就是包含了JDBC連接信息的bean,但是任何一種稍微復(fù)雜些的應(yīng)用程序都有十幾個(gè)類似的Bean??匆幌孪旅娴氖纠?/P>
- <bean id="dataSource" class="org.springFramework.jdbc. datasource.DriverManagerDataSource">
- <property name="driverClassName"> <value>org.postgresql.Driver< SPAN>value>
- < SPAN>property>
- <property name="url">
- <value>jdbc:postgresql://localhost/test< SPAN>value>
- < SPAN>property>
- <property name="username">
- <value>postgres< SPAN>value>
- < SPAN>property>
- <property name="password">
- <value>< SPAN>value>
- < SPAN>property>
- < SPAN>bean>
這個(gè)解決方案的問(wèn)題在于對(duì)applicationContext.xml文件的維護(hù)。對(duì)于初學(xué)者來(lái)說(shuō),設(shè)想一下,項(xiàng)目放在源代碼版本控制系統(tǒng)中,例如CVS。下面,假設(shè)您希望在網(wǎng)站中添加新的功能,那么就需要在應(yīng)用程序上下文定義中添加額外的Bean定義。問(wèn)題是如何在生產(chǎn)服務(wù)器上體現(xiàn)這些改變。
通常情況下,應(yīng)用程序的本地實(shí)例不會(huì)與活動(dòng)站點(diǎn)使用同樣的數(shù)據(jù)庫(kù),因此applicationContext.xml文件將包括讓您能夠訪問(wèn)本地?cái)?shù)據(jù)庫(kù)的設(shè)置。當(dāng)您想提交在源代碼版本庫(kù)中的改變時(shí),就需要注意這些特定于主機(jī)屬性的同步性。版本庫(kù)中的文件最終可能使用本地設(shè)置中的配置。如果想在生產(chǎn)服務(wù)器上更新配置,就必須手動(dòng)同步這些屬性的值。這是非??菰锏娜蝿?wù),而且還非常容易出錯(cuò)。
對(duì)于應(yīng)用程序的每個(gè)實(shí)例來(lái)說(shuō),這個(gè)問(wèn)題更加重要。假如有三位開(kāi)發(fā)人員正在使用代碼段基址,而且他們使用的是本地的數(shù)據(jù)庫(kù)。當(dāng)您提交更改的時(shí)候,他們每個(gè)人在本地服務(wù)器上更新源代碼的時(shí)候都必須非常謹(jǐn)慎。他們會(huì)手動(dòng)同步這些更改,然后提交他們的工作。這樣一來(lái),版本控制系統(tǒng)對(duì)于這些配置文件來(lái)說(shuō)已經(jīng)毫無(wú)用處。如果曾經(jīng)使用過(guò)Spring MVC框架,那么您應(yīng)該知道applicationContext.xml是應(yīng)用程序中的關(guān)鍵組件,因?yàn)槭撬鼘⑺械臇|西粘合在一起。所以,我們需要一種機(jī)制來(lái)幫助使應(yīng)用程序中各項(xiàng)保持有序,這點(diǎn)非常重要。
正如前面所提到的,這是您可能遇到的較簡(jiǎn)單的配置問(wèn)題。更難的問(wèn)題出現(xiàn)在當(dāng)需要在不同服務(wù)器中進(jìn)行不同的Bean連接的時(shí)候。這類問(wèn)題常會(huì)出現(xiàn)在日常軟件開(kāi)發(fā)任務(wù)中。例如,假如您的產(chǎn)品有一個(gè)客戶身份驗(yàn)證模塊,可以對(duì)來(lái)自關(guān)系數(shù)據(jù)庫(kù)或LDAP服務(wù)器中的用戶進(jìn)行身份驗(yàn)證。自然,這一身份驗(yàn)證模塊可以使用抽象了特定版本庫(kù)的Bean進(jìn)行配置。如果您想改變不同應(yīng)用程序部署中驗(yàn)證用戶的方式,就需要在applicationContext.xml文件中進(jìn)行不同的Bean連接。這種配置問(wèn)題常見(jiàn)于在部署中有可配置特性的所有應(yīng)用程序。
在下文中,我們將討論這兩種配置問(wèn)題。首先我們會(huì)關(guān)注同步的Bean屬性問(wèn)題及其解決方案,接下來(lái),我們會(huì)討論更加復(fù)雜的同步Bean連接問(wèn)題。
【編輯推薦】