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

  • 相关阅读:
    科普 | 验证码有什么用?
    验证码是什么?有什么作用?(风控必看)
    银保监会提示信用卡逾期风险 简析“以卡养卡”背后的三个原因
    微信、电商、机票、抖音上的黑灰产“生意”
    假“信用卡”坑用户害商家 如何帮助银行构建反欺诈模型
    “羊毛党”们最喜欢用的手机号码分析
    是贫穷限制了想象力?双11黑产薅一天可吃一年,史上最强反羊毛党科普
    一场直播成交过亿?揭开数字背后的猫腻
    关联网络的特点有哪些?
    “双十一”购物节 电商平台面临的五大业务风险
  • 原文地址:https://www.cnblogs.com/benx/p/3410844.html
Copyright © 2011-2022 走看看