spring源码之MVC的DispatcherServlet初始化

 

概述

上一篇找到了两个入口,本篇从DispatcherServlet类的initStrategies进行分析

DispatcherServlet初始化自身使用的对象

  • 入口方法,做了九件事
    • 初始化多媒体解析器,如果没有配置id为multipartResolver的,类型为MultipartResolver的bean,则没有提供多媒体解析器,可以参考链接博文,后面专门分析
    • 初始化国际化解析器,如果配置文件没有定义,则使用AcceptHeaderLocaleResolver,可以参考链接博文,后面专门分析
    • 初始化主题解析器,用来处理一些有关动态更换样式的支持,没有用过,前后端分离后,更不会用了。
    • 初始化handleMapping,分析的重点
    • 初始化适配器,分析重点
    • 初始化异常解析器,如果没有配置,则没有异常解析器。后面进行分析,后面专门分析
    • 初始化视图名称转换器,后面专门分析
    • 初始化视图解析器,分析的重点
    • 初始化FlashMapManager,这个东西是用在重定向时,在重定向之前的属性保存起来,这些属性可以给后一个请求使用。没有 用过,不进行分析  
//DispatcherServlet类的方法
protected
void initStrategies(ApplicationContext context) { initMultipartResolver(context); initLocaleResolver(context); initThemeResolver(context); initHandlerMappings(context); initHandlerAdapters(context); initHandlerExceptionResolvers(context); initRequestToViewNameTranslator(context); initViewResolvers(context); initFlashMapManager(context); }
//spring-webmvc项目的DispatcherServlet.properties文件
//定义了一些默认的解析器
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\ org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
  • 初始化HandlerMapping
private void initHandlerMappings(ApplicationContext context) {
    this.handlerMappings = null;

    if (this.detectAllHandlerMappings) {
        // Find all HandlerMappings in the ApplicationContext, including ancestor contexts.
        Map<String, HandlerMapping> matchingBeans =
                BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
        if (!matchingBeans.isEmpty()) {
            this.handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values());
            // We keep HandlerMappings in sorted order.
            AnnotationAwareOrderComparator.sort(this.handlerMappings);
        }
    }
    else {
        try {
            HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);
            this.handlerMappings = Collections.singletonList(hm);
        }
        catch (NoSuchBeanDefinitionException ex) {
            // Ignore, we'll add a default HandlerMapping later.
        }
    }

    // Ensure we have at least one HandlerMapping, by registering
    // a default HandlerMapping if no other mappings are found.
    if (this.handlerMappings == null) {
        this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
        if (logger.isDebugEnabled()) {
            logger.debug("No HandlerMappings found in servlet '" + getServletName() + "': using default");
        }
    }
}

总结

本篇主要是找到DispathcerServlet初始化和请求处理的两个入口,以进行后面的分析

参考链接

  • https://www.cnblogs.com/weknow619/p/6341395.html(ContextLoaderListener与DispatcherServlet的创建的上下文)
  • http://www.cnblogs.com/fangjian0423/p/springMVC-dispatcherServlet.html(源码分析参考博文)
  • https://www.cnblogs.com/tengyunhao/p/7670293.html(多媒体文件的解析)
  • https://blog.csdn.net/qq924862077/article/details/52878507?locationNum=4&fps=1(国际化解析器)

猜你喜欢

转载自www.cnblogs.com/lucas2/p/9418787.html