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

posted @ 2025-10-05 17:01  wenzhuo4657  阅读(1)  评论(0)    收藏  举报