zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Codeforces Round #696 (Div. 2) A
    软件体系结构期末复习
    LINUX 下配置 redis
    2020-09-30 刷题记录
    2020-09-29 刷题记录
    Codeforces Round #673 (Div. 2) A
    2020-09-26 刷题记录
    2020-09-25 刷题记录
    C++ 类虚函数实现原理的验证(指向包含类虚函数地址的数组的指针)
    Saleae8 与 SaleaeLogic、PulseView上位机的使用
  • 原文地址:https://www.cnblogs.com/benx/p/3410844.html
Copyright © 2011-2022 走看看