Spring-MVC web.xml文件不使用ContextLoaderListener。

18 浏览
0 Comments

Spring-MVC web.xml文件不使用ContextLoaderListener。

我理解ContextLoaderListener和DispatcherServlet的目的是什么。

我不理解的是,如果我在web.xml文件中没有指定ContextLoaderListener类,为什么我的Sprin-MVC应用程序会启动。

我期望会出现一个错误,显示缺少上下文或类似的内容。

0
0 Comments

在配置Spring MVC的web.xml文件时,如果没有使用ContextLoaderListener,可能会出现以下问题:

问题原因:

- DispatcherServletContextLoaderListener加载的上下文是两个不同的上下文。

- DispatcherServlet会自己加载它的上下文,默认情况下会使用模板[servletName]-servlet.xml来寻找配置文件。例如,对于名为dispatcherDispatcherServlet,配置文件应该是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"章节中找到。

0
0 Comments

问题原因:由于上下文定义非常常规和完整,不需要使用ContextLoaderListener。Spring可以直接处理所有的配置。只有当有一些无法被Spring处理的特殊初始化需求时,才需要使用ContextLoaderListener。

解决方法:如果确实需要使用ContextLoaderListener,可以自己实现一个ContextLoaderListener的子类,并进行配置(可以在xml文件中或通过注解方式)。自己实现的ContextLoaderListener可以根据需要进行任何操作(例如,从非标准源中获取配置,以便注入到Spring上下文中)。

0