Spring-MVC web.xml文件不使用ContextLoaderListener。
在配置Spring MVC的web.xml文件时,如果没有使用ContextLoaderListener,可能会出现以下问题:
问题原因:
- DispatcherServlet
和ContextLoaderListener
加载的上下文是两个不同的上下文。
- DispatcherServlet
会自己加载它的上下文,默认情况下会使用模板[servletName]-servlet.xml
来寻找配置文件。例如,对于名为dispatcher
的DispatcherServlet
,配置文件应该是dispatcher-servlet.xml
。但是你也可以使用contextConfigLocation
参数指定自己的文件名。
解决方法:
- 在web.xml文件中配置DispatcherServlet
时,可以使用contextConfigLocation
参数指定自定义的配置文件名。例如:
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:custom-name-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
- 在应用中可以有多个DispatcherServlet
实例,每个实例代表一个独立的MVC应用,并且每个实例都有自己独立的上下文。不同的DispatcherServlet
实例无法访问彼此的上下文。
- ContextLoaderListener
加载根上下文。在应用中只能有一个根上下文(或者根本没有)。每个DispatcherServlet
实例都可以访问这个上下文。可以将这个上下文看作是子上下文的父上下文,当应用需要获取一个bean实例时,它会首先在子上下文中查找,如果找不到就会去根上下文中查找。
更多详细信息可以在Spring文档的"Context Hierarchy"章节中找到。