1. 程式人生 > >spring中applicationContext.xml在web.xml中的配置路徑說明

spring中applicationContext.xml在web.xml中的配置路徑說明

在web專案裡使用了spring框架,我們經常需要在web容器啟動時自動初始化spring容器。要想實現這一功能,就需要在web.xml中增加一個上下文引數,指定spring的配置檔案applicationContext.xml。

<context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/classes/config/applicationContext.xml</param-value>


  </context-param>

引數名稱contextConfigLocation是固定屬性名,不可寫錯。為什麼呢,

/WEB-INF/classes/config/applicationContext.xml說明applicationContext.xml是在原始碼下的config目錄下的。

光宣告配置檔案的路徑是不夠的,還要宣告spring框架的web上下文載入監聽器。配置Listener

 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</

listener-class>
  </listener>

監聽器設定好後,啟動web容器時,就會啟動ContextLoaderListener的方法contextInitialized() 。而在方法contextInitialized() 中有以下程式碼:

  1. publicvoid contextInitialized(ServletContextEvent event) {  
  2.     this.contextLoader = createContextLoader();  
  3.     if (this.contextLoader == null) {  
  4.         this.contextLoader = 
    this;  
  5.     }  
  6.     this.contextLoader.initWebApplicationContext(event.getServletContext());  
  7. }  
藉助容器的上下文this.contextLoader去初始一個spring的應用上下文initWebApplicationContext,使用到了ContextLoader這個類 在ContextLoader類中初始化時有這樣一塊static程式碼
  1. static {  
    // Load default strategy implementations from properties file.
  1.     // This is currently strictly internal and not meant to be customized
  2.     // by application developers.
  3.     try {  
  4.         //這一句會去載入同在此包下的一個properties檔案的值(ContextLoader.properties)
  5.         ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, ContextLoader.class);  
  6.         defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);  
  7.     }  
  8.     catch (IOException ex) {  
  9.         thrownew IllegalStateException("Could not load 'ContextLoader.properties': " + ex.getMessage());  
  10.     }  
  11. }  

ContextLoader.properties的屬性檔案中有org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext

可以通過屬性檔案反射生成XmlWebApplicationContext,而在XmlWebApplicationContext中有這個常量

publicstaticfinal String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";  

說明spring的web預設載入spring檔案的啟動位置了,是在web-inf下,如果想指定新的目錄,可以在web的上下文引數中指定路徑,那麼在哪個引數中指定呢。

接下來我們繼續看ContexLoader類,裡面有一個常量。

publicstaticfinal String CONFIG_LOCATION_PARAM = "contextConfigLocation";  

而XmlWebApplicationContext物件正是呼叫了這個引數去設定啟動位置

  1. wac.setConfigLocation(servletContext.getInitParameter(CONFIG_LOCATION_PARAM));  

再往上看XmlWebApplicationContext繼承的AbstractRefreshableConfigApplicationContext類中的setConfigLocation方法將此抽象類中的String[] configLocations值填充

並在AbstractRefreshableConfigApplicationContext類中我們看到spring對預設啟動檔案位置和配置啟動檔案位置的支援


  1. protected String[] getConfigLocations() {  
  2.     return (this.configLocations != null ? this.configLocations : getDefaultConfigLocations());  
	protected String[] getConfigLocations() {
		return (this.configLocations != null ? this.configLocations : getDefaultConfigLocations());

}

1. 首先 classpath是指 WEB-INF資料夾下的classes目錄

2. classpath 和 classpath* 區別: 
classpath:只會到你的class路徑中查詢找檔案; 
classpath*:不僅包含class路徑,還包括jar檔案中(class路徑)進行查詢. 

如果applicationContext.xml配置檔案存放在WEB-INF下面

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/applicationContext*.xml</param-value>
    </context-param>

如果applicationContext.xml配置檔案存放在src目錄下

context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

需要注意的是,部署到應用伺服器後,src目錄下的配置檔案會和class檔案一樣,自動copy到應用的 classes目錄下,spring的 配置檔案在啟動時,載入的是web-info目錄下的applicationContext.xml, 執行時使用的是web-info/classes目錄下的applicationContext.xml。因此,不管applicationContext.xml配置檔案存放在src目錄下,還是存放在WEB-INF下面,都可以用下面這種方式來配置路徑:

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/applicationContext*.xml</param-value>
    </context-param>

當有多個配置檔案載入時,可採用下面程式碼來配置:

複製程式碼
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value> 
            classpath*:conf/spring/applicationContext_core*.xml, 
            classpath*:conf/spring/applicationContext_dict*.xml,
            classpath*:conf/spring/applicationContext_hibernate.xml,
            ......
        </param-value>
    </context-param>
複製程式碼

也可以用下面的這種方式:

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:**/applicationContext-*.xml</param-value>
    </context-param>

"**/"表示的是任意目錄; 

"**/applicationContext-*.xml"表示任意目錄下的以"applicationContext-"開頭的XML檔案。 

Spring配置檔案最好以"applicationContext-"開頭,且最好把所有Spring配置檔案都放在一個統一的目錄下,也可以分模組建立。

  

相關推薦

ideaapplicationContext-trans.xml的Cannot resolve bean 'dataSource'...的問題解決

問題如下: (applicationContext-trans.xml中的部分截圖) 先了解問題是怎麼出現的: 此處的dataSource是在applicationContext-dao.xml中配置的,如下: 本來是想直接引用過來,沒想到會出現無法解析的錯誤 問題解決: 原因是:因為sp

Spring之AOP在XML配置方法

字段 object 代理 [] ger 編程 調用 加載器 bsp AOP 即 Aspect Oriental Program 面向切面編程 先來一個栗子: <aop:config> <aop:pointcut id="

ideaapplicationContext-dao.xml檔案Cannot resolve file***** :spring xml model validation問題

訪問不了classpath下的資料夾中的檔案 解決辦法如下:(問題出在我建立的resources資料夾是一個普通的資料夾) 1、本來是普通的資料夾 2、ctrl+shift+alt+s開啟如下介面: 3、點選Test Resources  4、apply-->OK&n

Spring筆記三】SpringBean(XML方式配置

我們可以把 Spring 看作一個大型的工廠,而 Spring 容器中的 Bean 就是該工廠的產品。要想使用這個工廠生產和管理Bean,就需要在配置檔案中告訴它需要哪些 Bean,以及需要使用何種方法將這些 Bean 裝配到一起。 首先,分清楚 JavaBean 和 

spring boot專案 mybatis-config.xml配置

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.o

spring boot專案 mybatis-config.xml配置

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.o

SpringApplicationContext載入機制和配置初始化

Spring中ApplicationContext載入機制。         載入器目前有兩種選擇:ContextLoaderListener和ContextLoaderServlet。         這兩者在功能上完全等同,只是一個是基於Servlet2.3版本中新引入

spring上下文在web.xml配置

<!-- Spring配置檔案開始 --> <context-param> <param-name>contextConfigLocation</param-name> &l

spring mvc 在Web.xml自動掃描Spring配置檔案及resource時classpath*:與classpath:的區別

首先在web.xml中配置監聽器listener,讓spring進行自動獲取。具體加入的程式碼如下: <listener><listener-class>org.springframework.web.context.ContextLoad

01 Maven構建的項目,把.xml配置文件添加到編譯目錄

build 文件 構建 main %20 sources 更新 目錄 如果 Maven構建的項目,默認只會把src/main/resources目錄下的xml配置文件添加到編譯目錄。 如果需要把src/main/java目錄下的xml配置文件也添加到編譯目錄,需要在pom.

Android studiogit使用及git配置路徑

原文地址: http://blog.csdn.net/asdf717/article/details/54290796 非常感謝原作者 此文很詳細 本人看到後壓抑不住內心的激情 想轉載 為以後自己忘記好找而轉 也為廣大新手而轉 一. Android Stutio配置git   set

Hibernatehibernate.cfg.xml核心配置檔案配置

<property>行為標籤,name需要操作的物件 //dialect表示資料庫的方言,例org.hibernate.dialect.MySQLDialect <property

spring專案,web.xml的 ContextLoaderListener監聽器的原理

</pre><pre class="java" name="code">建立監聽器和ServletContext的code:</pre><pre class="java" name="code"><context-par

tomcat的server.xml檔案配置了URIEncoding="UTF-8"需要注意的問題

1.      get請求傳遞中文時本地連正式庫訪問都正常,正式環境下單獨訪問報錯 程式碼:            請求:project/projectInfo/export/?cks=’專案型別 public String export(ProjectIn foproje

java開發常用的xml,properties配置

web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http

maven 打war包報異常(web.xml 以及jsp js css不在war包),以及pom.xml 檔案配置

一、maven war 打包異常資訊 異常資訊: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode

android程式的AndroidManifest.xml的uses-feature詳解

AndroidManifest.xml中的uses-feature 在Android的manifest檔案: 用於指定android程式,是否需要某種硬體或軟體資源/功能。 uses-feature的語法 <uses-feature  

Android學習(32)在Acticity獲取strings.xml

strings.xml <resources> <string name="app_name">androidtest2</string> <string name="size_s">S</s

Maven:如何在構建修改pom.xmlversion版本號

我們在不斷的java版本釋出過程中,每個版本的版本號都需要手動設定,以標識該版本號,是否能通過其他方式來解決呢 經過不斷的查詢發現Maven可以用mvn命令修改pom.xml中的version 命令如下:mvn versions:set -DartifactId=frame

Android stutio 怎麼將XML檔案快速findById——Android Layout ID Converter外掛

我們在寫Android佈局檔案時,在XML中寫好佈局,然後會在MainActivity中findById例項化,如果少了還好,但一個佈局有幾十個控制元件呢? 在Android stutio中這些程式碼不必手敲出來的。 這需要用到Android Layou