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文件