即使web.xml不包含它,如何运行Spring的ContextLoaderListener?

时间:2016-04-28 20:27:33

标签: java spring servlets servlet-3.0 servletcontextlistener

我有一个webapp我继承自另一个使用spring的团队。我一直试图调试一些奇怪的行为,并希望"关闭"任何spring servlets / filters / context-listeners。

所以我删除了web.xml中看起来像这样的条目......

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/applicationContext.xml
    </param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

然而,在我们的应用程序清理/构建和运行之后,我在方法contextInitialized上点击了org.springframework.web.context.ContextLoaderListener。

所以我的问题是,如果我的web.xml不再将ContextLoadListener声明为监听器来运行它/为什么运行?我看了,Spring 3.2.3-RELEASE的源代码似乎没有Servlet 3.0 Annotation @WebServletContextListener。

那么为什么/如何运行这个Context Listener?

enter image description here

1 个答案:

答案 0 :(得分:2)

Servlet 3.0引入了ServletContainerInitializer

  

允许向库/运行时通知Web的接口   应用程序的启动阶段并执行任何所需的程序   注册servlet,过滤器和监听器以响应它。

如果你的类路径上有spring-web jar,它会隐式注册它自己的接口实现SpringServletContainerInitializer。这反过来会扫描类路径上WebApplicationInitializer的实现。

你显然有SpringWebApplicationInitializer

  

[...]通过添加Spring来初始化Spring上下文   ContextLoaderListener的{​​{1}}。

您认为最有可能发生的ServletContext