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