DispatcherServlet 初始化流程
初始化流程:
1、创建WebApplicationContext context,设置context的setServletContext、setServletConfig、setId、setNamespace
2、执行context.refresh(),加载spring文件,参见文章 spring 加载流程
3、把context加入request Attribute 中key 为 FrameworkServlet.class.getName() + ".CONTEXT." ServletName
4、spring加载问题后执行DispatcherServlet .onRefresh方法
/** * This implementation calls {@link #initStrategies}. */ @Override protected void onRefresh(ApplicationContext context) { initStrategies(context); } /** * Initialize the strategy objects that this servlet uses. * <p>May be overridden in subclasses in order to initialize further strategy objects. */ protected void initStrategies(ApplicationContext context) { initMultipartResolver(context); //从spring context中获取MultipartResolver.class initLocaleResolver(context);//从spring context中获取LocaleResolver.class initThemeResolver(context);//从spring context中获取ThemeResolver.class initHandlerMappings(context);//从spring context中获取HandlerMapping.class initHandlerAdapters(context);//从spring context中获取HandlerAdapter.class initHandlerExceptionResolvers(context);//从spring context中获取HandlerExceptionResolver.class initRequestToViewNameTranslator(context);//从spring context中获取RequestToViewNameTranslator.class initViewResolvers(context);//从spring context中获取ViewResolver.class initFlashMapManager(context);//从spring context中获取FlashMapManagerFlashMapManager.class }
从上面的流程看出主要是加载spring和从spring context中获取对应的对象来初始化servlet,这些对象主要是通过<mvc:annotation-driven />来加载的,器解析器为
public class MvcNamespaceHandler extends NamespaceHandlerSupport { public void init() { registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser()); registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser()); registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser()); registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser()); registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser()); } }
我们主要看AnnotationDrivenBeanDefinitionParser ,其解析流程为:
1、往spring context中放入 RequestMappingHandlerMapping 该class极其重要,它实现InitializingBean接口,其afterPropertiesSet方法会执行initHandlerMethods,参见AbstractHandlerMethodMapping.initHandlerMethods;主要是遍历spring context中所有实例,如果实例包含注解 Controller和 RequestMapping 那么将对实例生成 以url为key,method为value的URLMapping 等会会详谈
2、放入ConfigurableWebBindingInitializer.class 解析 <conversion-service> 和 <validator> 和 <message-codes-resolver> 作为其属性
3、放入RequestMappingHandlerAdapter.class
a、解析<message-converters>,如果没有将默认加载http解析器,设置其messageConverters属性
默认添加
ByteArrayHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
SourceHttpMessageConverter
AllEncompassingFormHttpMessageConverter
根据jar包添加
MappingJacksonHttpMessageConverter
MappingJackson2HttpMessageConverter
Jaxb2RootElementHttpMessageConverter
RssChannelHttpMessageConverter
AtomFeedHttpMessageConverter
b、解析<argument-resolvers> ,设置属性customArgumentResolvers
c、解析<return-value-handlers>,设置属性customReturnValueHandlers
d、解析<async-support>,设置属性asyncRequestTimeout
e、解析<async-support>下面<task-executor>,这种属性taskExecutor
f、解析<async-support>下面<callable-interceptors>,设置属性callableInterceptors
g、解析<async-support>下面<deferred-result-interceptors>,设置属性deferredResultInterceptors
4、ConversionServiceExposingInterceptor.class
5、MappedInterceptor.class
6、ExceptionHandlerExceptionResolver.class
7、ResponseStatusExceptionResolver.class
8、DefaultHandlerExceptionResolver.class
具体的实现可以看代码
AbstractHandlerMethodMapping.afterPropertiesSet