在servlet容器的生命周期中,容器首先初始化ServletContextListener
,那么Filter
and Servlet
实例。
Spring Web 应用程序通常加载两个上下文:根上下文和调度程序 servlet 上下文。这ContextLoaderListener
类是一个ServletContextListener
它加载应用程序(或根)上下文。它通过以下方式标识要加载的文件context-param
与名字contextConfigLocation
正如下面的 web.xml 中给出的
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/mvc-dispatcher-servlet.xml
</param-value>
</context-param>
或者,默认情况下,通过在以下位置查找文件/WEB-INF/applicationContext.xml
。既然你已经指定了/WEB-INF/mvc-dispatcher-servlet.xml
as the contextConfigLocation
,该上下文将被加载。
完成此操作后,容器将初始化DispatcherServlet
,它还会加载上下文。它通过以下方式识别文件加载init-param
带有名称的元素contextConfigLocation
如下面的 web.xml 所示
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/some-random-location.xml</param-value>
</init-param>
</servlet>
或者,默认情况下,通过在以下位置查找文件/WEB-INF/name-of-your-servlet-servlet.xml
。换句话说,它的值是<servlet-name>
元素和附加-servlet.xml
并在其中查找它WEB-INF
.
由于您还没有指定init-param
有名字contextConfigLocation
, the DispatcherServlet
加载上下文文件/WEB-INF/mvc-dispatcher-servlet.xml
,因为它的名字是mvc-dispatcher
。加载的上下文DispatcherServlet
可以访问由ContextLoaderListener
,这就是为什么我们称其为根上下文(以及其他子上下文)。
所有这一切都表明您的ContextLoaderListener
和你的DispatcherServlet
正在创建自己的副本ApplicationContext
通过每次加载一个XmlWebApplicationContext
来自同一文件/WEB-INF/mvc-dispatcher-servlet.xml
.
确定您认为整个应用程序应该使用哪些 bean 或配置,并将它们放入将由应用程序加载的文件中ContextLoaderListener
。确定您认为应该可用的 bean 或配置DispatcherServlet
并将它们放入其上下文文件中。