java - Spring Servlet 项目的 web.xml 中加载 contextConfi

假设我有一个 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 将首先加载哪个 contextConfigLocation?它是generalApplicationContext.xml 还是specificApplicationContext.xml?更重要的是,加载顺序是否重要?从我的调试工作来看,它似乎确实如此,因为当我将一些独立的 Spring 配置从一个文件移动到另一个文件时,我得到了不同的错误。

注意: 对多个 servlet 映射使用多个 spring 配置是否是一个好的做法是值得商榷的。使用 XML 配置而不是新的 Java 配置也是如此。但这不是我想在这里问的。让我们试着专注于我的主要问题。

最佳答案

generalApplicationContext.xml 是第一个加载的,因为它是与 ContextLoaderListener

一起加载的 ApplicationContext
<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.xml 的子上下文,它将是 WebApplicationContext

<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>

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

关于java - Spring Servlet 项目的 web.xml 中加载 contextConfigLocation 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27539610/

相关文章:

java - 如何将 Class 值设置为 spring bean 属性?

java - 为什么不推荐使用 HibernateTemplate?

java - 如何使用 Spring 为 JUnit 测试注入(inject) ServletCon

java - 如何让 Spring 打印出哪些 Spring 配置文件处于 Activity 状态?

java - 我可以将来自 Maven 的属性(在 settings.xml 中定义的密码)注入(i

java - @Transactional(propagation=Propagation.REQU

java - Spring Security 匿名 401 而不是 403

java - Mybatis Spring多数据库Java配置

java - Spring MVC,转发

java - 如何从spring security获取当前登录的用户对象?