您好,登錄后才能下訂單哦!
這篇文章主要介紹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>
在這之后,我們有很多可以添加額外的資源以用于配置的方式。其中最明顯的就是使用<import>標簽將這一額外資源包含在 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"?>
<!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框架的高級配置方法有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。