DispatcherServlet和ServletContextInitializer(二)
DispatcherServlet
DispatcherServlet: HTTP 请求处理程序/控制器的中央调度程序,例如,用于 Web UI 控制器或基于 HTTP 的远程服务导出程序。分派到已注册的处理程序以处理 Web 请求,提供方便的映射和异常处理工具。
在(一)中大致搞清楚了servlet的注册,但是他与我们常用的controller又有很大的不同,它没办法控制请求类型,而是根据url进行控制,证据是servletContext仅仅只有一个 getContext()可以用于定位。
从结果上来说是,常见http请求被统一配置在DispatcherServlet,所有的控制都不是tomcat等servlet容器处理的,具体来说,应该是外部url找到了DispatcherServlet这个处理器,然后内部处理拒绝了非法的请求,也就是我们所说的springMVC层。
DispatcherServlet的注册是作为ServletContextInitializer的一种实现完成,
public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet, WebMvcProperties webMvcProperties, ObjectProvider<MultipartConfigElement> multipartConfig) {
DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet, webMvcProperties.getServlet().getPath());
registration.setName("dispatcherServlet");
registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());
Objects.requireNonNull(registration);
multipartConfig.ifAvailable(registration::setMultipartConfig);
return registration;
}
ServletContextInitializer
ServletContextInitializer的作用可以理解为注册servlet这一url处理器,但是他如何与不同的嵌入式服务器进行交互呢?或许可以直白的说利用了公共的接口,但还是最好找到这些接口和关键方法吧。
AbstractApplicationContext#refresh()--》onRefresh -》 ServletWebServerApplicationContext#createWebServer()
ServletWebServerFactory factory = getWebServerFactory();
createWebServer.tag("factory", factory.getClass().toString());
this.webServer = factory.getWebServer(getSelfInitializer());
getWebServerFactory会找到ServletWebServerFactory的实现子类,也就是所谓的嵌入式服务器的实现。
getSelfInitializer()会找到程序内所有的ServletContextInitializer,用于注册所有的servlet