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

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

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

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

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

这是随后的问题:How does spring-boot able to serve specific url?

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

示例代码

@EnableAutoConfiguration
public class TestSpring {

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

Spring Boot初始化步骤

以下是步骤:

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

转载注明原文:java – spring-boot – 哪一段代码实际上为springMVC注册了调度程序servlet? - 代码日志