Servlet context listener (web.xml) approach
- 用户正在部署Web应用程序WAR 。
- Servlet容器(Tomcat)读取
web.xml
。 - servlet上下文侦听
ContextLoaderListener
被实例化(如果定义为<listener>
内部的web.xml
)由servlet容器。 ContextLoaderListenerWebApplicationContext
使用应用程序上下文XML配置创建新的。- 你的ROOT上下文Bean是
BeanFactory
在应用程序上下文内部注册和实例化的。 DispatcherServlet
正在由servlet容器实例化。DispatcherServlet
创建自己的WebApplicationContext
(WEB-INF/{servletName}-servlet.xml默认情况下)以ROOT上下文作为其父级。- 你的servlet bean是
BeanFactory
在应用程序上下文内部注册和实例化的。 DispatcherServlet
注册一些默认的bean,以防你自己没有提供它们。
Servlet container initializer (non web.xml) approach
Servlet 3功能可以实现这一功能。
- 用户正在部署Web应用程序WAR 。
- Servlet容器搜索
ServletContainerInitializer
通过Java 实现的类ServiceLoader。 - 通过
servlet containerSpringServletContainerInitializer
查找并实例化Spring 。 - Spring的初始化程序读取 Web应用程序的类路径并搜索WebApplicationInitializer实现。
你
WebApplicationInitializer
被发现(顺便说一句,检查它的JavaDoc !!!)和实例化的SpringServletContainerInitializer
。你
WebApplicationInitializerWebApplicationContext
使用XML或@Configuration
基于配置的新ROOT 。- 你将
WebApplicationInitializerWebApplicationContext
使用XML或@Configuration
基于配置的新servlet 。 你
WebApplicationInitializerDispatcherServlet
将使用上一步中的上下文创建并注册新的上下文。Servlet container完成了Web应用程序的初始化,并实例化了由其类在先前步骤中注册的组件(在我的示例中没有)。
基于Java的方法更加灵活。你可以将上下文创建留给servlet容器
DispatcherServlet,甚至将其整个实例留给
DispatcherServletservlet容器(只需注册
servlet DispatcherServlet.class而不是其实例)。



