主要类
-
DispatcherServlet
入口类,继承FrameworkServlet,加载各个功能的实现类(从spring上下文获取对象)。比如异常处理、视图处理、请求映射处理等(initStrategies)。
protected void initStrategies(ApplicationContext context) {
//初始化文件流解析
initMultipartResolver(context);
//初始化本地解析器
initLocaleResolver(context);
//初始化主题解析器
initThemeResolver(context);
//初始化处理器映射器,将请求映射到处理器
initHandlerMappings(context);
//初始化处理器适配器
initHandlerAdapters(context);
//初始化处理器异常解析器,如果执行过程中遇到异常将交给HandlerExceptionResolver来解析
initHandlerExceptionResolvers(context);
//初始化请求到具体视图名称解析器
initRequestToViewNameTranslator(context);
//初始化视图解析器
initViewResolvers(context);
//初始化flash映射管理
initFlashMapManager(context);
}
-
FrameworkerServlet
继承HttpServletBean,同时实现了ApplicationConextAware,获取web上下文AnnotationConfigServletWebServerApplicationContext,同时重写initServletBean方法(HttpServletBean方法),调用DispatcherServlet的onRefresh方法,加载各个功能的实现类
-
HttpServletBean
继承HttpServlet,重写了init方法,主要做一些初始化的工作,在第一次请求会被调用。
-
WebMvcConfigurationSupport
- 启动时将RequestMappingHandlerMapping和RequestMappingHandlerAdapter这些bean添加到spring管理(DispatcherServlet中会拉取)
- 负责将实现WebMvcConfigure的类集合,统一回调,添加拦截器HandlerInterceptor,HttpMessageConveter等,添加到使用处。
- 拦截器HandlerInterceptor
protected final Object[] getInterceptors(
FormattingConversionService mvcConversionService,
ResourceUrlProvider mvcResourceUrlProvider) {
if (this.interceptors == null) {
InterceptorRegistry registry = new InterceptorRegistry();
//调用WebMvcConfigure实现类回调接口,添加拦截器
addInterceptors(registry);
registry.addInterceptor(new ConversionServiceExposingInterceptor(mvcConversionService));
registry.addInterceptor(new ResourceUrlProviderExposingInterceptor(mvcResourceUrlProvider));
this.interceptors = registry.getInterceptors();
}
return this.interceptors.toArray();
}
@Bean
@SuppressWarnings("deprecation")
public RequestMappingHandlerMapping requestMappingHandlerMapping(
@Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager,
@Qualifier("mvcConversionService") FormattingConversionService conversionService,
@Qualifier("mvcResourceUrlProvider") ResourceUrlProvider resourceUrlProvider) {
RequestMappingHandlerMapping mapping = createRequestMappingHandlerMapping();
mapping.setOrder(0);
//此处塞拦截器
mapping.setInterceptors(getInterceptors(conversionService, resourceUrlProvider));
DelegatingWebMvcConfiguration类
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
@Override
protected void addInterceptors(InterceptorRegistry registry) {
this.configurers.addInterceptors(registry);
}
WebMvcConfigurerComposite类
@Override
public void addInterceptors(InterceptorRegistry registry) {
//遍历所有WebMvcConfigurer的实现类,回调
for (WebMvcConfigurer delegate : this.delegates) {
delegate.addInterceptors(registry);
}
}
- 消息处理器HttpMessageConveter
装配RequestMappingHandlerAdapter
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter(
@Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager,
@Qualifier("mvcConversionService") FormattingConversionService conversionService,
@Qualifier("mvcValidator") Validator validator) {
RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter();
adapter.setContentNegotiationManager(contentNegotiationManager);
// 此处为RequestMappingHandlerAdapter的messageConverter设置属性值
adapter.setMessageConverters(getMessageConverters());
adapter.setWebBindingInitializer(getConfigurableWebBindingInitializer(conversionService, validator));
adapter.setCustomArgumentResolvers(getArgumentResolvers());
adapter.setCustomReturnValueHandlers(getReturnValueHandlers());
if (jackson2Present) {
adapter.setRequestBodyAdvice(Collections.singletonList(new JsonViewRequestBodyAdvice()));
adapter.setResponseBodyAdvice(Collections.singletonList(new JsonViewResponseBodyAdvice()));
}
AsyncSupportConfigurer configurer = new AsyncSupportConfigurer();
configureAsyncSupport(configurer);
if (configurer.getTaskExecutor() != null) {
adapter.setTaskExecutor(configurer.getTaskExecutor());
}
if (configurer.getTimeout() != null) {
adapter.setAsyncRequestTimeout(configurer.getTimeout());
}
adapter.setCallableInterceptors(configurer.getCallableInterceptors());
adapter.setDeferredResultInterceptors(configurer.getDeferredResultInterceptors());
return adapter;
}
/**
获取HttpMessageConverter
1.从spring容器里获取实现了HttpMessageConverter的类,见(HttpMessageConverters)
public HttpMessageConverters(Collection<HttpMessageConverter<?>> additionalConverters) {
this(true, additionalConverters);
}
2. HttpMessageConverters会调用WebMvcConfigurationSupport的getMessageConverters方法,获取默认HttpMessageConverter
3.从spring容器获取实现接口WebMvcConfigure的实现类,回调configureMessageConverters方法获取
**/
protected final List<HttpMessageConverter<?>> getMessageConverters() {
if (this.messageConverters == null) {
this.messageConverters = new ArrayList<>();
configureMessageConverters(this.messageConverters);
if (this.messageConverters.isEmpty()) {
addDefaultHttpMessageConverters(this.messageConverters);
}
extendMessageConverters(this.messageConverters);
}
return this.messageConverters;
}
DelegatingWebMvcConfiguration类
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
this.configurers.configureMessageConverters(converters);
}
WebMvcConfigurerComposite类
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
for (WebMvcConfigurer delegate : this.delegates) {
//所有实现类回调,添加HttpMessageConverter
delegate.configureMessageConverters(converters);
}
}
RequestMappingHandlerAdapter类实现了InitializingBean,会在bean实例化的时候调用
@Override
public void afterPropertiesSet() {
// Do this first, it may add ResponseBody advice beans
initControllerAdviceCache();
if (this.argumentResolvers == null) {
// 获取入参解析器入参解析器
List<HandlerMethodArgumentResolver> resolvers = getDefaultArgumentResolvers();
this.argumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);
}
if (this.initBinderArgumentResolvers == null) {
List<HandlerMethodArgumentResolver> resolvers = getDefaultInitBinderArgumentResolvers();
this.initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);
}
if (this.returnValueHandlers == null) {
// 获取返回值解析器
List<HandlerMethodReturnValueHandler> handlers = getDefaultReturnValueHandlers();
this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers);
}
}
private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {
List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(20);
// Single-purpose return value types
handlers.add(new ModelAndViewMethodReturnValueHandler());
handlers.add(new ModelMethodProcessor());
handlers.add(new ViewMethodReturnValueHandler());
handlers.add(new ResponseBodyEmitterReturnValueHandler(getMessageConverters(),
this.reactiveAdapterRegistry, this.taskExecutor, this.contentNegotiationManager));
handlers.add(new StreamingResponseBodyReturnValueHandler());
handlers.add(new HttpEntityMethodProcessor(getMessageConverters(),
this.contentNegotiationManager, this.requestResponseBodyAdvice));
handlers.add(new HttpHeadersReturnValueHandler());
handlers.add(new CallableMethodReturnValueHandler());
handlers.add(new DeferredResultMethodReturnValueHandler());
handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory));
// Annotation-based return value types
handlers.add(new ModelAttributeMethodProcessor(false));
// 此处会添加HttpMessageConverter,在处理@ResponseBody注解返回值序列化的时候使用
handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(),
this.contentNegotiationManager, this.requestResponseBodyAdvice));
// Multi-purpose return value types
handlers.add(new ViewNameMethodReturnValueHandler());
handlers.add(new MapMethodProcessor());
// Custom return value types
if (getCustomReturnValueHandlers() != null) {
handlers.addAll(getCustomReturnValueHandlers());
}
// Catch-all
if (!CollectionUtils.isEmpty(getModelAndViewResolvers())) {
handlers.add(new ModelAndViewResolverMethodReturnValueHandler(getModelAndViewResolvers()));
}
else {
handlers.add(new ModelAttributeMethodProcessor(true));
}
return handlers;
}
流程
-
方法入口:FrameworkerServlet重写了service方法,和doGet,doPost等方法,最终调用DispatcherServlet的doService方法
-
springmvc请求流程:DispatcherServlet拦截到请求,从HandlerMapping集合中根据请求的url获取对应的HandlerExecutionChain,里面包括Handler和HandlerInterceptor,HandlerMapping的主要实现包括
- SimpleUrlHandlerMapping:处理简单请求,不经controller实现路由跳转的;
- RequestMappingHandlerMapping:处理requestmapping请求方法,返回HandlerMethod
-
再根据获取的Handler获取HandlerAdapter适配器,调用supports方法,HandlerAdapter主要实现有:
- RequestMappingHandlerAdapter,处理@requestMapping方法,handler是HandlerMethod;
- HttpRequestHandlerAdapter, 处理实现HttpRequestHandler接口的类
- SimpleControllerHandlerAdapter:处理实现Controller的类;获取到对应的HandlerAdapter实现类,并调用handler方法,处理逻辑,返回ModelAndView,渲染视图
-
执行HandlerAdapter的handle方法,处理请求方法,最终调用RequestMappingHandlerAdapter的handleInternal方法,会根据前面获取的HandlerMethod,执行方法的业务逻辑invokeAndHandle,获取原始返回值(未序列化)
-
遍历所有的HandlerMethodReturnValueHandler,返回值处理器,匹配RequestResponseBodyMethodProcessor(@ResponseBody处理器),获取所有的HttpMessageConverter,对返回值序列化处理
-
启动Bean注册实例化流程
- DispatcherServletConfiguration类会注册DispatcherServlet,同时会根据ApplicationAware回调为FrameworkerServlet设置web上下文
- WebMvcConfigurationSupport类会将HandlerMapping和HandlerAdapter等实现类注册到spring上下文,后期会在DispatcherServlet类中加载这些bean