一,九大组件
坐标 dispatchServlet
/** MultipartResolver used by this servlet. */
//多部件解析器
@Nullable
private MultipartResolver multipartResolver;
/** LocaleResolver used by this servlet. */
//区域化 国际化解析器
@Nullable
private LocaleResolver localeResolver;
/** ThemeResolver used by this servlet. */
//主题解析器
@Nullable
private ThemeResolver themeResolver;
/** List of HandlerMappings used by this servlet. */
//处理器映射组件
@Nullable
private List<HandlerMapping> handlerMappings;
/** List of HandlerAdapters used by this servlet. */
//处理器适配器组件
@Nullable
private List<HandlerAdapter> handlerAdapters;
/** List of HandlerExceptionResolvers used by this servlet. */
//异常解析器
@Nullable
private List<HandlerExceptionResolver> handlerExceptionResolvers;
/** RequestToViewNameTranslator used by this servlet. */
// 默认视图名转换器组件
@Nullable
private RequestToViewNameTranslator viewNameTranslator;
/** FlashMapManager used by this servlet. */
// Flash属性管理组件
@Nullable
private FlashMapManager flashMapManager;
/** List of ViewResolvers used by this servlet. */
//视图解析器
@Nullable
private List<ViewResolver> viewResolvers;
二,九大组件初始化位置
坐标: DispatchServlet OnRefresh方法。
三,初始化调用方法onRefresh堆栈
AbstractApplicationContext --> refresh方法中 finishRefresh方法
SimpleApplicationEventMulticaster -》 doInvokeListener方法,以一种事件监听的方式去加载九大组件初始化策略
按照SourceFilteringListener -》 GenericApplicationListenerAdapter-》FrameworkServlet顺序调用onApplicationEvent方法最终调用九大组件初始化方法。
四,initHandlerMappings初始化
If的判断: 可以通过配置该属性选择HandlerMapping初始化的方式。
SpringMVC的接口化插件: 九大组件的存入方式可以发现都是接口,接口提供了规范性,比如要自己去做一个Handler插件,那么就要去实现HandlerMapping接口
如果获取到的HandlerMapping为NULL,那么还会提供一个默认实例化策略去完成
进入到默认策略生成HandlerMapping的方法, key值为HandlerMapping.class,这里重点放在defautlStrategies容器是如何初始化的。反向追踪,发现通过默认地址加载配置获取的class存入Properties中。默认地址DispatcherServlet.properties
全局搜索这个文件,可以看到该文件为九大组件默认加载配置类的文件,到这里位置,后面不在对其它的组件初始化做具体的分析,基本上原理一直,默认加载的方法这里用到了策略模式,提供了统一的策略生成手段。