Spring实际上是如何引导的?

use*_*426 17 java spring spring-mvc

  1. 有谁知道Spring实际上是如何引导的?
  2. 创建了哪些实例以及由谁创建?
  3. 我真的想知道是谁创建了WebApplicationContext和ContextLoader的实例.它是Tomcat的工作吗?

Pav*_*ral 41

Servlet上下文侦听器(web.xml)方法

  1. 用户正在部署Web应用程序WAR .
  2. Servlet容器(Tomcat)读取web.xml.
  3. servlet上下文侦听ContextLoaderListener被实例化(如果定义为<listener>内部的web.xml)由servlet容器.
    1. ContextLoaderListenerWebApplicationContext使用应用程序上下文XML配置创建新的
    2. 您的ROOT上下文bean BeanFactory在应用程序上下文中注册和实例化.
  4. DispatcherServlet正在由servlet容器实例化.
    1. DispatcherServlet使用ROOT上下文作为其父级创建自己的WebApplicationContext(WEB-INF/{servletName}-servlet.xml默认情况下).
    2. 您的servlet bean BeanFactory在应用程序上下文中注册并实例化.
    3. DispatcherServlet 注册一些默认bean,以防你自己没有提供它们.

Servlet容器初始化程序(非web.xml)方法

Servlet 3的功能可以实现这一功能.

  1. 用户正在部署Web应用程序WAR .
  2. Servlet容器搜索ServletContainerInitializer通过Java 实现的类ServiceLoader.
  3. Spring SpringServletContainerInitializer由servlet容器找到并实例化.
  4. Spring的初始化程序读取 Web应用程序的类路径并搜索WebApplicationInitializer实现.
  5. WebApplicationInitializer被发现(顺便说一句,检查它的JavaDoc !!!)和实例化SpringServletContainerInitializer.
    1. WebApplicationInitializerWebApplicationContext使用XML或@Configuration基于配置创建新的ROOT .
    2. WebApplicationInitializerWebApplicationContext使用XML或@Configuration基于配置创建新的servlet .
    3. WebApplicationInitializerDispatcherServlet使用上一步中的上下文创建并注册新的.
  6. Servlet容器完成Web应用程序初始化并实例化其在前面的步骤中由其类注册的组件(在我的示例中没有).

基于Java的方法更灵活.您可以将上下文创建保留到DispatcherServlet甚至整个实例化DispatcherServlet到servlet容器(只注册servlet DispatcherServlet.class而不是它的实例).