前面我们知道了他怎么处理表单映射,这里我们来研究一下,他是如何处理具体请求的。也就是说我有那么多/user你是怎么定位到我在哪个cotroller,并且你是怎么定位到我具体是哪个接口。
这里我们就来逐步定位一下这个问题。
一、组件分析
老路子,我们的所有逻辑都是一个个组件串起来的,我们先把组件一个个拿出来。看看他的功能。
组件1、@RequestMapping
我们的请求接口都标注了这个注解,然后生效的,虽然没啥逻辑,但是还是列出来。
组件2、请求处理器RequestMappingHandlerMapping
我们看到他在WebMvcAutoConfiguration中注册了一堆bean,是用来做请求映射处理的,其中有一个名字就是RequestMappingHandlerMapping 一看就是用来处理我们的@RequestMapping注解请求的。其余还有什么WelcomePageHandlerMapping 是用来处理欢迎页的,也就是那个默认的index.html页面的跳转。我们不管这个,就看到他给了RequestMappingHandlerMapping。
@Bean
@Primary
@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;
}
貌似都有了,有了映射,有了映射处理器,此外的就是看逻辑了。
二、源码流程
1、找到入口
我们先明确一下,怎么分析mvc这类源码,我们都知道入口类就是DispatcherServlet。而他再怎么花哨也就是个servlet,既然你是servlet,那就肯定主要逻辑实现在那个叫做doGet和doPost的方法里面。
我们就去找这个方法,可能这个里面没有,但是父类里面绝壁有。我们最后在FrameworkServlet这个类里面找到了这两个方法。