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

 

posted @ 2013-11-06 16:40  benx621  阅读(626)  评论(0编辑  收藏  举报