我试图找出spring-boot
,WebApplicationInitializer
的哪个实现实际注册了调度程序servlet。
我没有发现SpringBootServletInitializer
或其父类型的任何代码都是这样做的。
相反,AbstractDispatcherServletInitializer
完成了这项工作,但它是抽象的,我无法在Eclipse的帮助下找到任何具体的实现。
那么,实际调用哪一段代码来为springMVC注册调度程序servlet?
答案 0 :(得分:18)
以下是最终注册DispatcherServlet
的Spring Boot初始化步骤的说明。
@EnableAutoConfiguration
public class TestSpring {
public static void main(String[] args) throws Exception {
SpringApplication.run(TestSpring.class, args);
}
}
以下是步骤:
SpringApplication.run()
创建EmbeddedWebApplicationContext
应用程序上下文; refresh()
方法; TestSpring
的注释。它寻找导入注释。 EnableAutoConfiguration
就是其中之一。对于导入注释,刷新过程从注释value
获取相应的类并调用其selectImports()
方法; @EnableAutoConfiguration
,则相应的班级为EnableAutoConfigurationImportSelector
,selectImports()
会从META-INF/spring.factories
加载大量其他导入选择器; @Bean
注释的方法定义的bean,即需要Spring上下文自动调用相应方法来实例化它们的bean; resfresh()
继续并到达onRefresh()
,内部调用createEmbeddedServletContainer()
方法; ServletContextInitializer
的bean。其中之一是bean,由DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration#dispatcherServletRegistration()
类型的ServletRegistrationBean
方法定义,扩展ServletContextInitializer
。正如你可以从类的名称猜测的那样,当调用它们的ServletContext
方法时,这样的初始值设定项将给定的servlet(在本例中为 DispatcherServlet )添加到给定的onStartup()
; ServletContextInitializer
都将传递给此tomcat初始化 - 这是调用那些onStartup()
的{{1}}方法并创建ServletContextInitializer
的地方并注册为servlet ; DispatcherServlet
结束; onRefresh()
,其中tomcat最终由finishRefresh()
; TomcatEmbeddedServletContainer.start()
结束和其他最终初始化步骤; 答案 1 :(得分:2)
当您在自动配置期间查找Spring Boot执行的操作时,您应该查看*AutoConfiguration
类。在这种情况下,DispatcherServletAutoConfiguration
。
答案 2 :(得分:0)
如果要将Spring Boot应用程序部署为传统WAR,则Servlet 3.0 specification详细说明服务提供商如何设置它,以便3.0兼容的servlet容器将自动引导任何Web资产(Servlet,Filter, ServletContextInitializer' s)进入servlet容器。 "魔术"是在spring-web依赖中完成的。如果您取消它,那么您将找到文件" spring-web / META-INF / services / javax.servlet.ServletContainerInitializer"。打开文件,您将看到单行" org.springframework.web.SpringServletContainerInitializer"。此类委托给所有实现WebApplicationInitializer的类,更具体地说是它们的onStartup(ServletContext servletContext)方法。我在Spring Boot中已经知道了一个具体的类,即SpringBootServletInitializer。