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初始化步骤
以下是步骤:
-
SpringApplication.run()
创建EmbeddedWebApplicationContext
应用程序上下文; - 调用其
refresh()
方法; - 刷新过程读取起始类
TestSpring
注释。 它寻找导入注释。EnableAutoConfiguration
就是其中之一。 对于导入注释,刷新过程从注释value
获取相应的类并调用其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嵌入式服务器(尚未完全启动)。 在上一步中发现的所有
ServletContextInitializer
都被传递给这个tomcat初始化 – 这是调用那些ServletContextInitializer
的onStartup()
方法并创建DispatcherServlet
并将其注册为servlet ; - 应用程序上下文的
onRefresh()
结束; -
finishRefresh()
,其中tomcat最终由TomcatEmbeddedServletContainer.start()
启动; - 应用程序上下文的
refresh()
结束和其他最终初始化步骤; - 该应用正在运行。
当您在自动配置期间查找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 。