<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 71  文章 - 15  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    因為口渴,上帝創(chuàng)造了水;
    因為黑暗,上帝創(chuàng)造了火;
    因為我需要朋友,所以上帝讓你來到我身邊
    Click for Shaanxi xi'an, Shaanxi Forecast
    ╱◥█◣
      |田|田|
    ╬╬╬╬╬╬╬╬╬╬╬
    If only I have such a house!
    〖總在爬山 所以艱辛〗
    Email:myesjoy@yahoo.com.cn
    NickName:yesjoy
    MSN:myesjoy@hotmail.com
    QQ:150230516

    〖總在尋夢 所以苦痛〗

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    Hibernate在線

    Java友情

    Java認證

    linux經典

    OA系統(tǒng)

    Spring在線

    Structs在線

    專家專欄

    企業(yè)信息化

    大型設備共享系統(tǒng)

    工作流

    工作流產品

    網(wǎng)上購書

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    Spring MVC框架的高級配置

    轉貼來自:http://dev2dev.bea.com.cn/techdoc/2006068810.html

    時間:2006-06-08
    作者:Dejan Bosanac
    瀏覽次數(shù): 7201
    本文關鍵字:Spring,?configuration,?source control,?CVS,?subversion,?配置,?源代碼控制
    文章工具
    推薦給朋友?推薦給朋友
    打印文章?打印文章

      本文將為您提供關于Spring MVC框架的配置技巧,以幫助管理基于Spring的web應用程序的多個實例。本配置管理主題常被學術界所忽略,但是,這對于現(xiàn)實的web開發(fā)尤為重要。本主題并不直接關聯(lián)任何具體的技術,因此,我們將從最基本的概念開始對這個問題進行說明。下面,我們將根據(jù)Spring MVC框架,為基于本技術開發(fā)的項目提供一系列的解決方案。

    Spring配置

      人們經常會在一臺以上的主機上配置一種Web應用程序。例如,在生產中,一個網(wǎng)站可能只有一個實例。除了此實例外,開發(fā)人員可以在用于開發(fā)的機器上配置其他的(開發(fā))實例。也可以在公司(機構)內部的本地開發(fā)服務器上維護其他應用程序裝置,這將讓您受益匪淺。該實例的目的是使Web設計者可以獲得有質量保證的材料,并為需要為應用程序提供文件資料的人提供準入。

      大家都知道,即使是最簡單的場景,也需要安裝、配置和維護三個實例。而對于位于不同地理位置的團隊來說,要從事這樣的項目便更加困難。對于任何不是特別簡單的Web應用程序項目,都需要多名開發(fā)人員來安裝項目裝置和本地設置以及運行單元測試的裝置等。

      很多組織都將自己開發(fā)的產品作為Web應用程序。我們可以在很多產品中發(fā)現(xiàn)這種情況,例如電子商務系統(tǒng)、內容管理系統(tǒng)(CMS),以及博客發(fā)布平臺等。這類產品可在多個服務器中進行部署。對于成功的多用途W(wǎng)eb應用程序來說,他們的開發(fā)人員必須要保證他們的應用程序便于安裝,并且能夠與其他Web應用程序完美集成。經過上述討論之后,我們應該明了,作為本文主題的應用程序配置是通用Web應用程序項目開發(fā)人員所需要解決的重要問題之一。

      諸如CVS或Subversion之類的版本控制系統(tǒng)是開發(fā)組織使用的一種標準工具。這種工具代表了一些組織的中心源代碼版本庫,它們被用于保持源代碼的有序。用戶可以跟蹤應用程序源代碼的變化,顯示不同版本的區(qū)別,并可以確定項目分支。而且,它們使得在應用程序部署中進行部分更新成為可能。

      很明顯,版本控制系統(tǒng)軟件是跟蹤源代碼所必需的,它對于解決應用程序配置問題有非常大的幫助。在本文中,我們將不會把重點放在版本控制系統(tǒng)上,因為這方面已經有很多相關的材料了。在此,我們將關注版本控制問題中的一個小話題:如何使Web應用程序的配置更加便捷(尤其是使用Spring MVC框架編寫的Web應用程序)。

      問題是:我們在此討論的是一種什么樣的配置?任何Web應用程序都需要一些資源,這些資源通常都是其所運行的服務器所特有的,例如數(shù)據(jù)庫URL、發(fā)送電子郵件的SMTP服務器,以及包含專用軟件文件的文件夾等。這樣的設置應該集中,從而使應用程序配置更加簡單。

      但是,這只是這個問題最簡單的一種版本。有時候,在應用程序開發(fā)中需要更加復雜的配置。這意味著,必須將各次部署中的不同Bean連接起來,而這會使問題更加復雜。

      這些應用程序配置問題的解決方案有諸多優(yōu)勢,包括:簡化應用程序的安裝和配置過程,使源代碼版本控制更加簡便,減少源代碼版本庫中的沖突現(xiàn)象。下面,我們將通過示例詳細討論這個話題。

    問題

      我們首先來演示一下上文所提到的最簡單的版本。在這一場景中,我們希望在應用程序部署中改變的是簡單的配置參數(shù),例如鏈接、密碼等。如果您曾經使用Spring MVC框架開發(fā)過Web應用程序,那么您應該知道這里將用到的兩個配置文件:

    • /WEB-INF/applicationContext.xml,它讓您可以配置Bean,或者顯示應用程序上下文。通過這個文件,您可以定義自己的業(yè)務邏輯Bean、資源以及其他可以與Web端口相關聯(lián)的所有Bean。
    • /WEB-INF/[servlet-name]-servlet.xml,它被用于配置Web層、視圖解析器、控制器、校驗器以及其他所有MVC框架中必需的Bean。[servlet-name]指的是在web.xml部署描述符中定義的Spring dispatcher servlet的名稱。

      那么問題在哪兒呢?問題就出在applicationContext.xml中將包括一些特定于主機的Bean定義。其中,最明顯的一個示例就是包含了JDBC連接信息的bean,但是任何一種稍微復雜些的應用程序都有十幾個類似的Bean。看一下下面的示例:

    <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文件的維護。對于初學者來說,設想一下,項目放在源代碼版本控制系統(tǒng)中,例如CVS。下面,假設您希望在網(wǎng)站中添加新的功能,那么就需要在應用程序上下文定義中添加額外的Bean定義。問題是如何在生產服務器上體現(xiàn)這些改變。

      通常情況下,應用程序的本地實例不會與活動站點使用同樣的數(shù)據(jù)庫,因此applicationContext.xml文件將包括讓您能夠訪問本地數(shù)據(jù)庫的設置。當您想提交在源代碼版本庫中的改變時,就需要注意這些特定于主機屬性的同步性。版本庫中的文件最終可能使用本地設置中的配置。如果想在生產服務器上更新配置,就必須手動同步這些屬性的值。這是非常枯燥的任務,而且還非常容易出錯。

      對于應用程序的每個實例來說,這個問題更加重要。假如有三位開發(fā)人員正在使用代碼段基址,而且他們使用的是本地的數(shù)據(jù)庫。當您提交更改的時候,他們每個人在本地服務器上更新源代碼的時候都必須非常謹慎。他們會手動同步這些更改,然后提交他們的工作。這樣一來,版本控制系統(tǒng)對于這些配置文件來說已經毫無用處。如果曾經使用過Spring MVC,那么您應該知道applicationContext.xml是應用程序中的關鍵組件,因為是它將所有的東西粘合在一起。所以,我們需要一種機制來幫助使應用程序中各項保持有序,這點非常重要。

      正如前面所提到的,這是您可能遇到的較簡單的配置問題。更難的問題出現(xiàn)在當需要在不同服務器中進行不同的Bean連接的時候。這類問題常會出現(xiàn)在日常軟件開發(fā)任務中。例如,假如您的產品有一個客戶身份驗證模塊,可以對來自關系數(shù)據(jù)庫或LDAP服務器中的用戶進行身份驗證。自然,這一身份驗證模塊可以使用抽象了特定版本庫的Bean進行配置。如果您想改變不同應用程序部署中驗證用戶的方式,就需要在applicationContext.xml文件中進行不同的Bean連接。這種配置問題常見于在部署中有可配置特性的所有應用程序。

      在下文中,我們將討論這兩種配置問題。首先我們會關注同步的Bean屬性問題及其解決方案,接下來,我們會討論更加復雜的同步Bean連接問題。

    解決方案

    同步Bean屬性

      這個問題的一種可行的解決方案是將所有特定于主機的參數(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類的實例,并將其位置屬性設置為我們的屬性文件。該類被實現(xiàn)為Bean工廠的后處理器,并將使用定義在文件中的屬性來代替所有的占位符(${...}value)。

      利用這種技術,我們可以從applicationContext.xml中移除所有特定于主機的配置屬性。通過這種方式,我們可以自由地為該文件添加新的Bean,而不必擔心特定于主機屬性的同步性。這樣可以簡化生產部署和維護。

    同步性連接

      上面的技術解決了第一個問題,可是如果您計劃修改不同應用程序部署之間的Bean連接,這一技術便不很適合。針對這一問題的一個解決方案便是額外創(chuàng)建一個名為applicationContext-[hostname].xml 的XML定義文件。其中[hostname]是部署應用程序的主機的名稱。例如,在本地的機器上,這個文件通常名為applicationContext-localhost.xml,而在部署時,它可能更名為applicationContext-somehost.com.xml。

      可以猜測,這一文件必須包括特定于某一主機的所有配置Bean。在本文中,我們將假設dataSource bean定義將位于這類文件中,而不是通用的applicationContext.xml定義。當然,這種機制與前者并非沖突,但是為了更加簡單明了,我們將只關注這種方法。

      既然我們已經有了特定的配置,下面我們就來討論一下如何將其整合到整個Spring MVC配置概念中。要達到這一目的,可以有許多方法,我們將詳細地一一說明。但首先,我們應該注意到,由于有些Bean可能位于獨立的配置文件中,因此在applicationContext.xml中,所有對它們的局部引用都必須更換成全局名稱。

      例如,如下引用:

    ?<property?name="someProperty">
    ???
    <ref?local="someBean"/>
    ?
    </property>

      應更改為:

    ?<property?name="someProperty">
    ???
    <ref?bean="someBean"/>
    ?
    </property>

      在這之后,我們有很多可以添加額外的資源以用于配置的方式。其中最明顯的就是使用<import>標簽將這一額外資源包含在applicationContext.xml配置文件中。使用時,要將該標簽放在applicationContext.xml文件開頭。例如:

    <import?resource="applicationContext-somehost.com.xml"/>?

      現(xiàn)在,在獨立的XML定義文件和普通的應用程序上下文定義文件中的所有通用Bean定義都有了特定于主機的連接。由于大多數(shù)的Bean都不是特定于主機的,因此我們可以像處理Web應用程序中的其他資源一樣自由地處理applicationContext.xml文件,并可以通過合適的版本控制系統(tǒng)與其進行同步。

      但是,上述方法也有一定的弊端。如果您想保留不同XML文件的不同配置,就仍然必須擔心applicationContext.xml的同步性,因為資源的名稱必須根據(jù)不同服務器進行更改。雖然與原有的解決方案相比有了很大提高,只需更改文件名,但是這還是需要開發(fā)人員的手動協(xié)助。

      由于與applicationContext.xml相比,主機配置不需如此頻繁地進行更改,因此下一步便是將主機配置移動到web.xml文件中(如果可能的話)。幸運的是,我們有一個可用的解決方案。看一下下面關于web.xml配置的片斷:

    ? <listener>
    ???
    <listener-class>
    ????org.springframework.web.context.ContextLoaderListener
    ???
    </listener-class>
    ??
    </listener>
    ??
    <context-param>
    ????
    <param-name>contextConfigLocation</param-name>
    ????
    <param-value>
    ????/WEB-INF/applicationContext.xml?
    ???????/WEB-INF/applicationContext-somehost.com.xml
    ????
    </param-value>
    ??
    </context-param>

      正如您所看到的,除了web.xml文件中常有的ContextLoaderListener之外,我們還添加了contextConfigLocation上下文參數(shù)配置。這一參數(shù)用于指示框架查找這些配置文件的位置。如果這一參數(shù)被省略,則Spring就只能到applicationContext.xml中查找。這里我們也定義了特定于主機的配置文件來使用。

      利用這種方法,我們將所有特定于主機的配置從applicationContext.xml文件中移除,這樣便減輕了其在不同應用程序部署中的同步性。

      如果這種方法成為您的新習慣,您還可以使其更加靈活。通過遵守下列指令,也可以將特定于主機的配置從web.xml文件中移除。

      為此,需要創(chuàng)建特定于我們的應用程序上下文的類:

    package?net.nighttale.spring.util;

    import?java.net.InetAddress;

    import?org.springframework.web.context.support.XmlWebApplicationContext;

    public?class?PerHostXmlWebApplicationContext?
    ?
    extends?XmlWebApplicationContext?{
    ????????
    ????
    protected?String[]?getDefaultConfigLocations()?{
    ????????????String?hostname?
    =?"localhost";
    ????????????
    try?{
    ????????????????hostname?
    =?InetAddress.getLocalHost().getHostName();
    ????????????}
    ?catch?(Exception?e)?{
    ????????????}

    ????????????
    ????????????String?perHostConfiguration?
    =?DEFAULT_CONFIG_LOCATION_PREFIX?
    ?????????????????
    +?"applicationContext-"?
    ?????????????????
    +?hostname?
    ?????????????????
    +?DEFAULT_CONFIG_LOCATION_SUFFIX
    ?????????????????;
    ????
    ????????????logger.debug(
    ?????????????????
    "Adding?per?host?configuration?file:?"?
    ?????????????????
    +?perHostConfiguration
    ?????????????????);
    ????????????
    ????????????
    if?(getNamespace()?!=?null)?{
    ????????????????????
    return?new?String[]?{
    ??????????????DEFAULT_CONFIG_LOCATION_PREFIX?
    ????????????????
    +?getNamespace()?
    ????????????????
    +?DEFAULT_CONFIG_LOCATION_SUFFIX
    ?????????????,?perHostConfiguration}
    ;
    ????????????}

    ????????????
    else?{
    ????????????????????
    return?new?String[]?{
    ?????????????DEFAULT_CONFIG_LOCATION
    ??????????????,?perHostConfiguration}
    ;
    ????????????}

    ????}

    }

      這個類拓展了Spring中常被作為默認值使用的XmlWebApplicationContext。XmlWebApplicationContext類將Web應用程序的配置從XML定義文件中復制過來。默認情況下,它可以配置來自applicationContext.xml和[servlet-name]-servlet.xml文件中的應用程序。這個類執(zhí)行的惟一一項額外任務便是獲取它所在的主機名稱,并將applicationContext-[hostname].xml文件添加到配置文件列表中。

      為了使用這個類,我們需要對其進行編譯,將其包含在類途徑中,并指示Spring框架使用它。前兩步非常簡單,我們就不在此贅述。我們可以指示Sping通過contextClass上下文參數(shù)來使用它。除了web.xml文件中的原有配置,我們還可以添加下列內容:

    <context-param>
    ???
    <param-name>contextClass</param-name>
    ??
    <param-value>
    ???net.nighttale.spring.util.PerHostXmlWebApplicationContext
    ??
    </param-value>
    </context-param>

      如果我們使用這一配置片斷,將會有三個文件被用于初始化這個框架:[servlet-name]-servlet.xml、applicationContext-[hostname].xml以及applicationContext.xml。

      正如您所看到的,applicationContext.xml和web.xml文件已經完全擺脫了任何特定的配置細節(jié),而且您也不必擔心會在更新應用程序時破壞配置。

      但是,這種方法有一個不足之處。因為,不論是否會使用,都需要在應用程序部署中有第三個配置文件。在這種情況下,便不需要特定于主機的配置。例如:

    <?xml?version="1.0"?encoding="UTF-8"?>
    <!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?
    ????"http://www.springframework.org/dtd/spring-beans.dtd"
    >

    <beans></beans>

      最后,需要知道應用程序上下文類需要查找的特定主機名。檢查主機名稱的最簡單的方法是在機器上運行下列代碼:

    System.out.println(InetAddress.getLocalHost().getHostName())

      可以將其作為Java代碼執(zhí)行,也可在喜歡使用的腳本語言(如BeanShell或Groovy)中作為一個具有Java風格語法的腳本執(zhí)行。在獲取了主機的名稱之后,應該創(chuàng)建一個默認的/WEB-INF/applicationContext-[hostname].xml空文件夾(如我們上面所定義的),然后便可以開始了。

    結束語

      在本文中,我們提供了一系列的配置技巧,讓您在使用Spring MVC框架完成日常工作的時候更加輕松。如果您希望知道如何維護各種Web應用程序部署,可以試著找出最適合您的開發(fā)過程的解決方案。您的生活會更為輕松。

    參考資料

    原文出處:http://www.onjava.com/pub/a/onjava/2006/03/22/advanced-spring-configuration.html

    ?作者簡介
    Dejan Bosanac 是一位軟件開發(fā)人員、技術顧問和作者,他主要關注不同技術的整合和協(xié)作,尤其是與Java和Web相關的技術
    posted on 2007-03-28 16:57 ★yesjoy★ 閱讀(283) 評論(0)  編輯  收藏 所屬分類: Spring學習

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 无码日韩精品一区二区免费暖暖 | 亚洲午夜在线播放| 免费毛片网站在线观看| 九九久久精品国产免费看小说| 国产精品亚洲A∨天堂不卡| 曰批视频免费30分钟成人| 亚洲日韩精品无码专区 | 亚洲xxxxxx| 久久久久亚洲AV成人网人人软件| a级特黄毛片免费观看| 色婷五月综激情亚洲综合| 亚洲精品美女久久久久99小说| 91高清免费国产自产| 国产成人综合久久精品亚洲| 久久亚洲精品无码播放| h视频在线免费观看| 91情国产l精品国产亚洲区 | 久久精品国产亚洲AV高清热 | 三级黄色片免费看| 亚洲中文无码线在线观看| yy6080亚洲一级理论| 成人免费激情视频| 亚洲免费日韩无码系列| 亚洲午夜无码毛片av久久京东热| 亚洲日韩aⅴ在线视频| 免费观看的毛片手机视频| 69国产精品视频免费| www一区二区www免费| 亚洲欧美日韩一区二区三区在线| 亚洲av永久无码精品表情包 | 亚洲一区二区三区丝袜| 亚洲国产精品无码久久一线| 免费a在线观看播放| 丁香花在线观看免费观看| 99re在线精品视频免费| yellow视频免费在线观看| 国产亚洲精品2021自在线| 亚洲日本久久久午夜精品| 亚洲高清资源在线观看| 国产AV无码专区亚洲Av| 精品国产亚洲男女在线线电影 |