请求映射原理
DispatcherServlet请求拦截:
-
重写HttpServlet的HttpServletBean没重写
doGet/doPost
-
有继承的子类
FrameworkServlet
实现doGet/doPost
-
FrameworkServlet
实现的方案都指向processRequest(request, response);
-
processRequest中指向doService方法,然而并没有直接实现
-
doService衍生到子类
DispatcherServlet
的doService中 -
org.springframework.web.servlet.DispatcherServlet#doDispatch
-
通过
getHandler
方法寻找用于处理请求的controller在getHandler方法中调用五个自动注入的
handlerMapping
对象来循环查找能处理请求的maping对象及其方法五个自动注入的handlerMapping:
-
RequestMappingHandlerMapping
初始化时扫描@RequestMapping注解将对应的方法注入自身容器内用于匹配request请求
-
BeanNameUrlHandlerMapping
-
RouteFunctionMapping
-
SimpleUrlHandlerMapping
-
WelcomePageHandlerMapping
匹配
/
路径的欢迎页映射
-
-
在初始化通过注解将对应bean对象注入
启动时由于@EnableAutoConfiguration注解加上导入spring-web相关依赖自动加载WebMvcAutoConfiguration对象,在该对象中通过@Configuration+@Bean向spring容器中注入一些特定的handlerMapping对象如下:
@Override public RequestMappingHandlerMapping requestMappingHandlerMapping( @Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager, @Qualifier("mvcConversionService") FormattingConversionService conversionService, @Qualifier("mvcResourceUrlProvider") ResourceUrlProvider resourceUrlProvider) { // Must be @Primary for MvcUriComponentsBuilder to work return super.requestMappingHandlerMapping(contentNegotiationManager, conversionService, resourceUrlProvider); } @Bean public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) { WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping( new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(), this.mvcProperties.getStaticPathPattern()); welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider)); welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations()); return welcomePageHandlerMapping; }
这两个主要是:
-
处理根路径请求跳转到欢迎页的
welcomePageHandlerMapping
Bean对象 -
处理自定义mapping处理方法的
requestMappingHandlerMapping
Bean对象
-