在Spring Servlet项目的web.xml中加载contextConfigLocation的顺序

32 浏览
0 Comments

在Spring Servlet项目的web.xml中加载contextConfigLocation的顺序

假设我有一个Spring Java项目,我试图将其配置为Web服务器Servlet。下面是一个剥离后的web.xml文件的版本:

    contextConfigLocation
    
        /WEB-INF/spring/generalApplicationContext.xml
    


    my-servlet
    org.springframework.web.servlet.DispatcherServlet
    
        contextConfigLocation
        /WEB-INF/spring/specificApplicationContext.xml
    
    1


    my-servlet
    /foo/*

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

我的问题: Spring将首先加载哪个contextConfigLocation文件?是generalApplicationContext.xml还是specificApplicationContext.xml?更重要的是,加载顺序是否重要?从我的调试努力中,似乎显然是这样的,因为当我将某些独立的Spring配置从一个文件移动到另一个文件时,会出现不同的错误。

注:使用多个Spring配置来处理多个Servlet映射是否是一种好的做法尚有争议。同样适用于使用XML配置而不是新的Java配置。但这不是我想问的。让我们专注于我的主要问题。

admin 更改状态以发布 2023年5月21日
0
0 Comments

下面这一部分会加载上下文文件并创建ApplicationContext。这个上下文可能包含像中间层事务服务、数据访问对象或其它你想在整个应用程序中使用(和重复使用)的对象。每个应用程序将有一个应用程序上下文。


    contextConfigLocation
    
        /WEB-INF/spring/generalApplicationContext.xml
    

另一种上下文是WebApplicationContext,它是应用程序上下文的子上下文。在Spring Web应用程序中定义了每个DispatcherServlet都会有一个关联的WebApplicationContext。初始化WebApplicationContext的方式如下:


    my-servlet
    org.springframework.web.servlet.DispatcherServlet
    
        contextConfigLocation
        /WEB-INF/spring/specificApplicationContext.xml
    
    1

更多细节请参考这里这里

0
0 Comments

generalApplicationContext.xml 是将被首先加载的上下文,因为它是由 ContextLoaderListener 加载的 ApplicationContext


     org.springframework.web.context.ContextLoaderListener


    contextConfigLocation
    
        /WEB-INF/spring/generalApplicationContext.xml
    

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


    my-servlet
    org.springframework.web.servlet.DispatcherServlet
    
        contextConfigLocation
        /WEB-INF/spring/specificApplicationContext.xml
    
    1


    my-servlet
    /foo/*

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

0