spring-boot – 哪一段代码实际上为springMVC注册了调度程序servlet?

我试图在spring-boot找到, WebApplicationInitializer实现实际上注册了调度程序servlet。

我没有找到SpringBootServletInitializer任何片段代码或其父类型。

相反, AbstractDispatcherServletInitializer完成了这项工作,但它是抽象的,我在Eclipse的帮助下找不到任何具体的实现。

那么,实际上调用哪一段代码来为springMVC注册调度程序servlet?

这是一个随后的问题: spring-boot如何为特定url提供服务?

下面是最终注册DispatcherServlet的Spring Boot初始化步骤的描述。

示例代码

 @EnableAutoConfiguration public class TestSpring { public static void main(String[] args) throws Exception { SpringApplication.run(TestSpring.class, args); } } 

Spring Boot初始化步骤

以下是步骤:

  1. SpringApplication.run()创建EmbeddedWebApplicationContext应用程序上下文;
  2. 调用其refresh()方法;
  3. 刷新过程读取起始类TestSpring注释。 它寻找导入注释。 EnableAutoConfiguration就是其中之一。 对于导入注释,刷新过程从注释value获取相应的类并调用其selectImports()方法;
  4. @EnableAutoConfiguration的情况下,相应的类是EnableAutoConfigurationImportSelectorselectImports()META-INF/spring.factories加载大量其他导入选择器;
  5. 此过程以递归方式继续。 此外,还会读取这些导入选择器中的所有bean定义。 即它包括由带有@Bean注释的方法定义的bean,即需要Spring上下文自动调用相应方法来实例化它们的bean;
  6. resfresh()继续并到达onRefresh() ,在内部调用createEmbeddedServletContainer()方法;
  7. 在上一步中的读取bean定义中,搜索并实例化实现ServletContextInitializer bean。 其中之一是bean,它由ServletRegistrationBean类型的DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration#dispatcherServletRegistration()方法定义,该方法扩展了ServletContextInitializer 。 正如你可以从类的名称猜测的那样,当调用它们的onStartup()方法时,这样的初始化器将给定的servlet(在本例中为DispatcherServlet )添加到给定的ServletContext ;
  8. 创建了一个tomcat嵌入式服务器(尚未完全启动)。 在上一步中发现的所有ServletContextInitializer都被传递给这个tomcat初始化 – 这是调用那些ServletContextInitializeronStartup()方法并创建DispatcherServlet并将其注册为servlet ;
  9. 应用程序上下文的onRefresh()结束;
  10. finishRefresh() ,其中tomcat最终由TomcatEmbeddedServletContainer.start()启动;
  11. 应用程序上下文的refresh()结束和其他最终初始化步骤;
  12. 该应用正在运行。

当您在自动配置期间查找Spring Boot执行的操作时,您应该查看*AutoConfiguration类。 在本例中, DispatcherServletAutoConfiguration

如果要将Spring Boot应用程序部署为传统WAR,那么Servlet 3.0规范详细说明了服务提供者如何设置它,以便3.0兼容的servlet容器能够自动将任何Web资产(Servlet,Filter,ServletContextInitializer)引导到servlet中容器。 “魔术”是在spring-web依赖中完成的。 如果你解开它,你会找到文件“spring-web / META-INF / services / javax.servlet.ServletContainerInitializer”。 打开文件,你会看到单行“org.springframework.web.SpringServletContainerInitializer”。 此类委托所有实现WebApplicationInitializer的类,更具体地说是它们的onStartup(ServletContext servletContext)方法。 在Spring Boot中我有一个这样的具体类,即SpringBootServletInitializer 。