加载上下文的顺序配置在Web中的位置.xml Spring Servlet项目

2022-09-02 09:10:21

假设我有一个Spring Java项目,我正在尝试将其配置为Web服务器servlet。以下是 web.xml 文件的精简版本:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/generalApplicationContext.xml
    </param-value>
</context-param>

<servlet>
    <servlet-name>my-servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/specificApplicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>my-servlet</servlet-name>
    <url-pattern>/foo/*</url-pattern>
</servlet-mapping>

这里需要注意的关键是,我已经指定了两个要加载的XML文件。一个是我整个应用程序的通用方法,而另一个是特定于“my-servlet”servlet 的。对于只有一个 servlet 映射的设置,这是没有意义的。但是,我的项目具有多个 servlet 映射,每个映射都有特定的 Spring 设置。

我的问题:Spring将首先加载哪个上下文ConfigLocation?它将是一般的ApplicationContext.xml还是特定的ApplicationContext.xml?更重要的是,加载的顺序是否重要?从我的调试工作来看,很明显它确实如此,因为当我将一些独立的Spring配置从一个文件移动到另一个文件时,我会遇到不同的错误。

铌:是否对多个 servlet 映射使用多个弹簧配置是一种很好的做法,这是值得商榷的。使用 XML 配置而不是新的 Java 配置也是如此。但这不是我在这里想问的。让我们试着把重点放在我的主要问题上。


答案 1

generalApplicationContext.xml是将首先加载的那个,因为它是加载了ApplicationContextContextLoaderListener

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

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/generalApplicationContext.xml
    </param-value>
</context-param>

specificApplicationContext.xml实际上是加载的上述子上下文,它将是一个generalApplicationContext.xmlWebApplicationContext

<servlet>
    <servlet-name>my-servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/specificApplicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>my-servlet</servlet-name>
    <url-pattern>/foo/*</url-pattern>
</servlet-mapping>

是的,加载的顺序确实很重要。因为当加载父上下文时,必须满足所有必需的依赖项。


答案 2

以下部分加载上下文文件并创建应用程序上下文。例如,此上下文可能包含中间层事务服务、数据访问对象或您可能希望在应用程序中使用(和重用)的其他对象等组件。每个应用程序将有一个应用程序上下文。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/generalApplicationContext.xml
    </param-value>
</context-param>

另一个上下文是 WebApplicationContext,它是应用程序上下文的子上下文。在Spring Web应用程序中定义的每个应用程序都将有一个关联的.的初始化如下所示:DispatcherServletWebApplicationContextWebApplicationContext

<servlet>
    <servlet-name>my-servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/specificApplicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

有关更多详细信息,请参阅此内容此内容


推荐