Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
192 views
in Technique[技术] by (71.8m points)

java - spring-boot - Which piece of code actually register dispatcher servlet for springMVC?

I am trying to find out in spring-boot, which implementation of WebApplicationInitializer actually register the dispatcher servlet.

I didn't found any piece code from SpringBootServletInitializer or its parent types did that.

Instead, AbstractDispatcherServletInitializer does the job, but it's abstract, I can't find any of its concrete implementation with help of Eclipse.

So, which piece of code from which class is actually invoked to register the dispatcher servlet for springMVC?

This is a subsequent question of: How does spring-boot able to serve specific url?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Below is the description of Spring Boot initialization steps that eventually register DispatcherServlet.

Example Code

@EnableAutoConfiguration
public class TestSpring {

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

Spring Boot Initialization Steps

Here are the steps:

  1. SpringApplication.run() creates EmbeddedWebApplicationContext application context;
  2. Calls its refresh() method;
  3. Refresh process reads annotations of the starting class TestSpring. It looks for import annotations. EnableAutoConfiguration is one of them. For an import annotation the refresh process gets the corresponding class from the annotation value and invokes its selectImports() method;
  4. In case of @EnableAutoConfiguration the corresponding class is EnableAutoConfigurationImportSelector whose selectImports() loads tons of other import selectors from the META-INF/spring.factories;
  5. This process continues recursively. Also, all bean definitions, that are inside these import selectors, are read. I.e. it includes beans defined by a method with the @Bean annotation, i.e. beans that require the Spring context to call the corresponding method automatically to instantiate them;
  6. The resfresh() continues and reaches onRefresh(), the createEmbeddedServletContainer() method is called inside;
  7. Among read bean defitions at the previous step, beans implementing ServletContextInitializer are searched for and instantiated. One of them is the bean, defined by the DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration#dispatcherServletRegistration() method of ServletRegistrationBean type that extends ServletContextInitializer. As you can guess from the name of the class, such initializers add a given servlet (in this case DispatcherServlet) to a given ServletContext, when their onStartup() method is invoked;
  8. A tomcat embedded server is created (not started completely yet). All found ServletContextInitializers at the previous step are passed to this tomcat initialization - this is where the onStartup() methods of those ServletContextInitializers are called and DispatcherServlet gets created and registered as servlet;
  9. End of onRefresh() of application context;
  10. The finishRefresh() is called where tomcat is finally started by TomcatEmbeddedServletContainer.start();
  11. End of refresh() of application context and other final initialization steps;
  12. The app is running.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...