Spring MVC框架的高級配置(下)

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  上文介紹Spring MVC框架配置時遇到的問題,以下是解決方案.

  解決方案

  同步Bean屬性

  這個問題的一種可行的解決方案是將所有特定於主機的參數都放到普通的Java屬性文件中,使用Spring的PropertyPlaceHolderConfigurer類,將這些參數寫入Bean屬性中.

  使用這一解決方案,我們可以生成如下的屬性文件(/Web-INF/JDBC.properties):


  jdbc.driver=org.postgresql.Driver
  jdbcjdbc.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類的實例,並將其位置屬性設置為我們的屬性文件.該類被實現為Bean工廠的后處理器,並將使用定義在文件中的屬性來代替所有的佔位符(${...}value).

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

  同步性連接

  上面的技術解決了第一個問題,可是如果您計劃修改不同應用程序部署之間的Bean連接,這一技術便不很適合.針對這一問題的一個解決方案便是額外創建一個名為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>
  

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


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

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

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

  與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上下文參數配置.這一參數用於指示框架查找這些配置文件的位置.如果這一參數被省略,則Spring就只能到 applicationContext.xml中查找.這裡我們也定義了特定於主機的配置文件來使用.

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

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

  為此,需要創建特定於我們的應用程序上下文的類:


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文件中的應用程序.這個類執行的惟一一項額外任務便是獲取它所在的主機名稱,並將applicationContext-[hostname].xml文件添加到配置文件列表中.

  為了使用這個類,我們需要對其進行編譯,將其包含在類途徑中,並指示Spring框架使用它.前兩步非常簡單,我們就不在此贅述.我們可以指示Sping通過contextClass上下文參數來使用它.除了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文件已經完全擺脫了任何特定的配置細節,您也不必擔心會在更新應用程序時破壞配置.

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

<?xml version="1.0" encoding="UTF-8"?>


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

  結束語

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





[火星人 ] Spring MVC框架的高級配置(下)已經有621次圍觀

http://coctec.com/docs/java/show-post-61020.html