61

我正在阅读Spring MVC的文档,我有一个关于init参数的问题。如果重要的话,我使用的是Spring 3.2。contextConfigLocation和命名空间之间的区别是什么?contextConfigLocation是否仅用于指定上下文类可以找到XML定义的文件夹,而namespace属性用于指定文件名?

<servlet><servlet-name>AppServlet</servlet-name><servlet-class>org.springframework.web.servlet。DispatcherServlet</servlet-class><init-param>上下文配置位置WEB-INF</init-param><init-param>名称空间application-context.xml</init参数><加载启动>1</加载启动></servlet>

这是正确的吗?它应该使用/WEB-INF/application-context.xml吗?您应该指定路径吗?

5
  • 查看本文:Spring MVC上下文加载
    – 信息01
    评论 2013年4月4日19:01
  • @informatik01我不确定我是否完全明白了。如果要使用XML文件的另一个路径,是否更改命名空间?如果你有多个定义文件,那么contextConfigLocation呢?我不明白。 评论 2013年4月4日21:35
  • 1
    有关详细信息,请参阅我的答案。
    – 信息01
    评论 2013年4月5日3:05
  • @informatik01谢谢你的好文章。 评论 2014年12月1日10:54
  • @med_alpa Je vous en prie))
    – 信息01
    评论 2014年12月1日11:32

3个答案

重置为默认值
177

TL;博士

只需设置contextConfigLocation(上下文配置位置)当您需要指定自定义配置文件时。这样,您将同时指定配置文件名及其位置。

这个命名空间本质上是一种替代方法告诉Spring容器上下文加载器类要使用什么配置文件。我从不为此烦恼,只是使用contextConfigLocation(上下文配置位置)每当我需要配置自定义配置文件时。

下面是我以前的一个Spring项目中的一个示例(为了简洁起见,省略了一些配置):

web.xml网站

<?xml version=“1.0”encoding=“UTF-8”?><web-app xmlns=“http://java.sun.com/xml/ns/javaee"xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=“http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">Spring Web应用程序示例<!-- 根应用程序上下文(父上下文)-->的配置<听众><listener-class>org.springframework.web.context。ContextLoaderListener</listener-class></listener><上下文图表>上下文配置位置<参数值>/WEB-INF/spring/jdbc/spring-jdbc.xml/WEB-INF/spring/security/spring-security-context.xml</param-value></context-param><!-- DispatcherServlet应用程序上下文的配置(子上下文)--><servlet><servlet-name>spring-mvc</servlet-name><servlet-class>org.springframework.web.servlet。DispatcherServlet</servlet-class><init-param>上下文配置位置<参数值>/WEB-INF/spring/mvc/spring-mvc-servlet.xml</param-value></init-param></servlet><服务映射><servlet-name>spring-mvc</servlet-name><url模式>/admin/*</url模式></servlet-mapping></web-app>

冗长的回答

好的,首先让我们明确一些重要时刻。我们正在处理两种类型的上下文:

  1. 根上下文(父级)
  2. 单个servlet上下文(儿童)

引用Spring Framework API(撰写本文时的版本3.2.2)Web应用程序上下文(重点是矿山):

与通用应用程序上下文一样,web应用程序上下文是层次结构。每个应用程序只有一个根上下文,而应用程序中的每个servlet(包括MVC框架)有自己的子上下文.

这里还有:上下文层次结构:

例如,如果您正在开发Spring MVC web应用程序通常会有通过Spring加载的根WebApplicationContextContextLoaderListener和a通过加载的子WebApplicationContextSpring的DispatcherServlet。这会产生父子上下文共享组件和基础结构配置所在的层次结构在根上下文中声明并在子上下文中使用特定于web的组件。

在这里:17.2 DispatcherServlet:

Spring中的ApplicationContext实例可以确定作用域。在Web MVC中框架,每个DispatcherServlet都有自己的WebApplicationContext,它继承了根中已经定义的所有beanWeb应用程序上下文。这些继承的bean可以在特定于servlet的作用域,您可以定义新的特定于作用域的bean本地到给定Servlet实例。


现在让我们看看根应用程序上下文配置。下面是一个示例:
web.xml网站

<?xml version=“1.0”encoding=“UTF-8”?><web-app xmlns=“http://java.sun.com/xml/ns/javaee"xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=“http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><听众><listener-class>org.springframework.web.context。ContextLoaderListener</listener-class></listener><上下文图表>上下文配置位置<参数值>/WEB-INF/spring/daoContext.xml/WEB-INF/spring/applicationContext.xml</param-value></context-param></web-app>


来自Spring官方文档(重点是我的):
5.14.4方便的web应用程序ApplicationContext实例化:

您可以声明性地创建ApplicationContext实例通过使用,例如,ContextLoader。当然,您也可以创建通过使用ApplicationContext实现。

你可以使用ContextLoaderListener注册ApplicationContext(参见上面的示例)

侦听器检查contextConfigLocation参数。如果参数不存在,侦听器使用/WEB-INF/applicationContext.xml作为默认值。当参数为存在时,侦听器使用预定义的分隔符(逗号、分号和空白),并将这些值用作将搜索应用程序上下文的位置。Ant-style路径也支持模式。示例为/WEB-INF/*Context.xml for所有名称以“Context.xml”结尾的文件,位于“WEB-INF”目录和/WEB-INF/**/*Context.xml,用于所有此类文件在“WEB-INF”的任何子目录中。


Spring配置通常被分割为多个文件。它更符合逻辑,更方便,尤其是在大型项目中。在我们的示例中,我们明确定义了两个配置XML文件:dao上下文.xml应用程序上下文.xml在自定义位置:/WEB-INF/弹簧/再一次,如果我们没有定义contextConfigLocation(上下文配置位置),的ContextLoaderListener将尝试查找默认配置文件:/WEB-INF/applicationContext.xml.

注:
这个根上下文是可选的。另请参阅此答案:https://stackoverflow.com/a/7451389/814702

因此,如果默认/WEB-INF/applicationContext.xml配置文件不符合您的需要,请使用ContextLoaderListener随着<上下文图表> contextConfigLocation(上下文配置位置)可以在其中定义自定义配置文件定义根应用程序上下文.


接下来,让我们看看单个(子)应用程序上下文。来自Spring官方文档(重点是我的):
17.2调度服务

在初始化DispatcherServlet时,Spring MVC会查找名为
WEB-INF目录中的[servlet-name]-servlet.xml
您的并创建在那里定义的bean,覆盖全局中定义的同名bean的定义范围。

考虑以下DispatcherServlet Servlet配置(在web.xml文件):

<网络应用程序><servlet><servlet-name>高尔夫<servlet-class>org.springframework.web.servlet。DispatcherServlet</servlet类><加载启动>1</加载启动></servlet><服务映射><servlet-name>高尔夫<url-pattern>/高尔夫/*</servlet-mapping></web-app>


关于contextConfigLocation和命名空间

根据文件(重点是我的):

有了上述Servlet配置,您将需要一个名为
/WEB-INF/golfing-servlet.xml在您的应用程序中;文件将包含所有SpringWebMVC特定组件(豆类)。您可以更改此配置文件的确切位置通过Servlet初始化参数(有关详细信息,请参见下文)。
...
您可以自定义单个DispatcherServlet实例通过添加Servlet初始化参数(init-param元素)到Servletweb.xml文件中的声明。列表见下表支持的参数(共个)。

  • contextClass(上下文类):实现WebApplicationContext的类,该类实例化此Servlet使用的上下文。默认情况下,使用XmlWebApplicationContext。

  • contextConfigLocation(上下文配置位置):传递给上下文实例(由contextClass指定)的字符串,以指示可以在何处找到上下文。该字符串可能由多个字符串组成(使用逗号作为分隔符),以支持多个上下文。如果具有两次定义的bean的多个上下文位置,则最新位置优先。

  • 命名空间:WebApplicationContext的命名空间。默认为[servlet name]-servlet。


现在,让我们研究相关类的API文档。这个班级DispatcherServlet扩展抽象类框架Servlet。来自框架ServletAPI文档(重点是我的):

将“contextConfigLocation”servlet init-param传递给上下文实例,将其解析为可能的多个文件路径由任意数量的逗号和空格分隔,如
“test-servlet.xml,myServlet.xml”。如果未明确指定,则上下文实现应该从servlet的名称空间.

默认名称空间是“'servlet-name'-servlet”,例如“test-servlet”对于servlet-name“test”(导致出现“/WEB-INF/test-servlet.xml”XmlWebApplicationContext的默认位置)。命名空间可以也可以通过“名称空间”servlet init-pram显式设置.

这是摘自框架Servlet源代码:
框架Servlet.java

..../***WebApplicationContext命名空间的后缀。如果此类的servlet是*给定上下文中的名称“test”,servlet使用的名称空间将*决心“test-servlet”。*/公共静态最终字符串DEFAULT_NAMESPACE_SUFFIX=“-servlet”;....


的默认上下文类框架ServletXmlWeb应用程序上下文。来自XmlWeb应用程序上下文API文档(重点是我的):

默认情况下,配置将取自根上下文的“/WEB-INF/applicationContext.xml”,以及“/WEB-INF/test-servlet.xml”用于具有命名空间的上下文“test-servlet”(类似于具有servlet-name“测试”)。

配置位置默认值可以通过ContextLoader和servlet的“contextConfigLocation”上下文面板FrameworkServlet的init-pram配置位置可以表示具体文件,如“/WEB-INF/context.xml”或Ant-style模式,如“/WEB-INF/*-context.xml”(有关模式,请参阅PathMatcher javadoc详细信息)。

使用覆盖默认配置位置上下文配置位置与上面示例中的根应用程序上下文相同。

至于覆盖默认命名空间有些重要时刻。设置新名称空间时,不要事先准备/网络信息并且不要附加.xml文件到它。如果我们在源文件中查找XmlWeb应用程序上下文类别:
XmlWebApplicationContext.java

.../**根上下文的默认配置位置*/公共静态最终字符串DEFAULT_CONFIG_LOCATION=“/WEB-INF/applicationContext.xml”;/**为命名空间构建配置位置的默认前缀*/公共静态最终字符串DEFAULT_CONFIG_LOCATION_PREFIX=“/WEB-INF/”;/**为命名空间构建配置位置的默认后缀*/公共静态最终字符串DEFAULT_CONFIG_LOCATION_SUFFIX=“.xml”;.../***根上下文的默认位置是“/WEB-INF/applicationContext.xml”,*和“/WEB-INF/test-servlet.xml”,用于名称空间为“test-servlet”的上下文*(类似于带有servlet-name“test”的DispatcherServlet实例)。*/@覆盖受保护字符串[]getDefaultConfigLocations(){if(getNamespace()!=null){返回新字符串[]{DEFAULT_CONFIG_LOCATION_PREFIX+getNamespace()+DEFAULT_CONFIG_LOCATION_SUFFIX};}其他{返回新的String[]{DEFAULT_CONFIG_LOCATION};}}

正如你所见,源代码说明了一切。


指定自定义命名空间的示例

web.xml网站

<?xml version=“1.0”encoding=“UTF-8”?><web-app xmlns=“http://java.sun.com/xml/ns/javaee"xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=“http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><!-- DispatcherServlet应用程序上下文的配置(子上下文)--><servlet><servlet-name>spring-mvc</servlet-name><servlet-class>org.springframework.web.servlet。DispatcherServlet</servlet-class><init-param>名称空间<param-value>spring/mvc/spring-mvc</param-value></init-param></servlet><服务映射><servlet名称>spring-mvc</servlet名称><url-pattern>/*</servlet-mapping></web-app>

结果是,不是使用默认名称空间来构造配置文件的路径,而是/WEB-INF/spring-mvc-servlet.xml,容器将查找/WEB-INF/spring/mvc/spring-mvc.xml.

注:
以上与设置自定义名称空间相关的解释是默认的XmlWeb应用程序上下文上下文类。可以指定一个替代类,如批注ConfigWebApplicationContext,所以会有一些特别的时刻。


结论

它(IMHO)更易于使用contextConfigLocation(上下文配置位置)参数为根应用程序上下文和单个上下文定义自定义配置文件。唯一的区别是,对于根应用程序上下文,您使用<上下文图表>在内部<网络应用程序>元素,但不在特定servlet中(也不要忘记侦听器类)。对于您使用的子上下文<init-param>嵌套在<servlet>要素对于每个特定的servlet。请参阅我的配置示例(web.xml网站)在这篇文章的开头。

其他资源(好像上述资源还不够:-):

4

我认为LuckyLuke的答案有很多有用的信息,但它并没有回答这个问题。特别是,“namespace”和“contextConfigLocation”参数是如何协同工作的?

我唯一能找到具体答案的地方是源代码:

  • 命名空间参数设置用于生成违约上下文配置位置
  • contextConfigLocation(上下文配置位置)参数显式设置上下文配置位置,而不是依赖于从命名空间构建的默认位置

contextConfigLocation和命名空间之间的区别是什么?contextConfigLocation用于指定spring配置文件的路径,这意味着它们将被初始化。命名空间用于指定Spring MVC的DispatcherServlet的路径和名称。默认值为[调度员名称]-servlet.xml,下面是一个示例:

<servlet><servlet-name>调度程序<servlet-class>org.springframework.web.servlet。DispatcherServlet</servlet-class><init-param>名称空间<param value>config/spring mvc</param value></init-param><加载启动>1</加载启动></servlet>

Spring将通过以下路径搜索要用作mvc配置的文件/WEB-INF/config/spring-mvc.xml.
contextConfigLocation是否仅用于指定上下文类可以在其中找到XML定义的文件夹

<上下文图表>上下文配置位置<param-value>/WEB-INF/config/app-*.xml</context-param>

上面的代码显示,当应用程序启动时,Spring将加载WEB-INF/config目录中名称以“app-”开头、以“.xml”结尾的所有文件。

它应该使用/WEB-INF/application-context.xml吗?您应该指定路径吗?
通过以上示例,我们可以知道,在配置Spring时,我们需要指定完整路径和通用文件名,而在仅使用SpringMVC时,我们应该指定路径(如果它位于目录中,则不包括WEB-INF目录)和名称(不包括扩展名)。
希望能帮助您:)

2
  • 1
    老实说,我不确定是否理解这个答案。 评论 2013年4月4日21:27
  • 知识来自实践,只要尝试一下,你就会明白。
    – 猎人赵
    评论 2013年4月5日3:01

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.