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

Eri*_*ang 6 java spring spring-mvc spring-boot

我试图找出spring-boot,WebApplicationInitializer实际注册调度程序servlet的实现.

我没有找到任何部分代码SpringBootServletInitializer或其父类型做到这一点.

相反,AbstractDispatcherServletInitializer做的工作,但它是抽象的,我无法在Eclipse的帮助下找到任何具体的实现.

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

这是一个后续问题:spring-boot如何为特定网址提供服务?

Art*_*kov 20

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

示例代码

@EnableAutoConfiguration
public class TestSpring {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(TestSpring.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

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,由扩展类型的DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration#dispatcherServletRegistration()方法定义.正如你可以从类的名称猜测的那样,当调用它们的方法时,这样的初始化器将给定的servlet(在本例中为DispatcherServlet)添加到给定的;ServletRegistrationBeanServletContextInitializerServletContextonStartup()
  8. 创建了一个tomcat嵌入式服务器(尚未完全启动).ServletContextInitializer在上一步中找到的所有s都被传递给这个tomcat初始化 - 这是调用onStartup()那些ServletContextInitializers 的方法并DispatcherServlet创建并注册为servlet的地方 ;
  9. onRefresh()应用程序上下文结束;
  10. finishRefresh()被称为Tomcat所在最终被启动TomcatEmbeddedServletContainer.start();
  11. 的端refresh()应用程序上下文和其它最终初始化步骤的;
  12. 该应用正在运行.

  • 这也适用于非嵌入式Web应用程序,它不需要`main()`方法,但扩展了`org.springframework.boot.web.support.SpringBootServletInitializer`,并用`@ SpringBootApplication`标记.然后`SpringServletContainerInitializer`将扫描它,因此应用程序类在部署时被实例化和调用.`@SpringBootApplication`本身也标有`@ EnableAutoConfiguration`,因此从这里开始,它与答案中的故事相同. (2认同)