SpringBoot MVC(2)Servlet的初始化

783 阅读1分钟

DispatcherServlet的初始化

首次请求会触发DispatcherServlet的初始化。

FrameworkServlet->initServletBean():
    this.webApplicationContext = initWebApplicationContext();
    // DispatcherServlet未对其做处理
    initFrameworkServlet();

这里的webApplicationContext是应用上下文,在dispatcherServlet实例化时,通过ApplicationContextAwareProcessor这个后置处理器赋予。

FrameworkServlet->initWebApplicationContext():
    onRefresh(wac);
DispatcherServlet->onRefresh():
    initStrategies(context);
// 开始进行初始化
DispatcherServlet->initStrategies():
    initMultipartResolver(context);
    initLocaleResolver(context);
    initThemeResolver(context);
    // 初始化请求映射
    initHandlerMappings(context);
    initHandlerAdapters(context);
    // 初始化异常处理
    initHandlerExceptionResolvers(context);
    initRequestToViewNameTranslator(context);
    // 初始化视图处理
    initViewResolvers(context);
    initFlashMapManager(context);

初始化的结果是给dispatcherServlet的成员变量赋值,以请求映射为例:

DispatcherServlet->initHandlerMappings():
    this.handlerMappings = null;
    // 从IoC容器中找到实现了HandlerMapping接口的bean,把它赋给handlerMappings变量
    Map<String, HandlerMapping> matchingBeans =
    BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
    if (!matchingBeans.isEmpty()) {
        this.handlerMappings = new ArrayList<>(matchingBeans.values());
        AnnotationAwareOrderComparator.sort(this.handlerMappings);
    }
    if (this.handlerMappings == null) {
        // 如果没有的话,使用dispatcherServlet默认的请求映射类
        // 默认设置在DispatcherServlet.properties这个文件下
        // defaultStrategies的设置在该类的static代码块中,通过读取配置文件的形式赋值,值得借鉴
        this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
    }

常用handlerMapping介绍

本应用中的handlerMappings如下: RequestMappingHandlerMapping的由来在上篇分析过,它是用来处理@RequestMapping注解的

BeanNameUrlHandlerMapping,通过beanName访问,beanName必须以"/"开头,很少用到。

如下图,在浏览器中输入"localhost:8080/beanName"即可调用到该方法

SimpleUrlHandlerMapping负责处理静态文件资源,1.请求资源目录/META-INF/resources/webjars/下的文件(对应localhost:8080/webjars/xxx) 2.请求资源目录/META-INF/resources//resources//static//public/下的文件(对应localhost:8080/xxx) 时,会返回文件

如下图,在浏览器中输入"localhost:8080/c.html"即可获取到c.html文件