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

  • 相关阅读:
    JeePlus:代码生成器
    JeePlus:API工具
    Java实现 洛谷 P1023 税收与补贴问题
    Java实现 洛谷 P1023 税收与补贴问题
    Java实现 洛谷 P1023 税收与补贴问题
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
    Java实现 洛谷 P1328 生活大爆炸版石头剪刀布
  • 原文地址:https://www.cnblogs.com/benx/p/3410844.html
Copyright © 2011-2022 走看看