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

How is ContextLoaderListener from Spring being run even when web.xml does not include it?

我有一个从另一个使用 spring 的团队继承的网络应用程序。我一直在尝试调试一些奇怪的行为,并希望 "turn off" any 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>

然而不知何故,在我们的应用程序 clean/build 和 运行 之后,我在方法 contextInitialized 上点击了 org.springframework.web.context.ContextLoaderListener。

所以我的问题是,如果我的 web.xml 不再将 ContextLoadListener 声明为 运行 how/why 的侦听器,它是 运行 吗?我查看了 Spring 3.2.3-RELEASE 的源代码似乎没有 Servlet 3.0 注释@WebServletContextListener。

那么why/how这个上下文监听器是运行ning吗?

引入了 Servlet 3.0 ServletContainerInitializer

Interface which allows a library/runtime to be notified of a web application's startup phase and perform any required programmatic registration of servlets, filters, and listeners in response to it.

如果您的类路径上有 spring-web jar,它会隐式注册它自己的此接口的实现,SpringServletContainerInitializer. This in turn scans for implementations of WebApplicationInitializer 在类路径上。

你显然有 SpringWebApplicationInitializer 其中

[...] initializes Spring context by adding a Spring ContextLoaderListener to the ServletContext.

您看到的 ContextLoaderListener 很可能来自于此。