// 在父类Servlet中的init方法中就执行到了onRefresh方法,开始初始化SpringMVC的九大组件
protected void onRefresh(ApplicationContext context) {
this.initStrategies(context);{
this.initMultipartResolver(context);{
this.multipartResolver = (MultipartResolver)context.getBean("multipartResolver", MultipartResolver.class);
if(e){
this.multipartResolver = null;
}
}
this.initLocaleResolver(context);{
this.localeResolver = context.getBean(LOCALE_RESOLVER_BEAN_NAME, LocaleResolver.class);
// 如果出现异常,获取默认的到DispatcherServlet.properties找
if(e){
this.localeResolver = getDefaultStrategy(context, LocaleResolver.class);
}
}
this.initThemeResolver(context);{
this.themeResolver = context.getBean(THEME_RESOLVER_BEAN_NAME, ThemeResolver.class);
// 如果出现异常,获取默认的到DispatcherServlet.properties找
if(e){
this.themeResolver = getDefaultStrategy(context, ThemeResolver.class);
}
}
this.initHandlerMappings(context);{
this.handlerMappings = null;
// detectAllHandlerMappings默认为true,会先找已经注册过的HandlerMapping
// <init-param> 可以通过这个配置修改,让它不要去自动HandlerMappings
// <param-name>detectAllHandlerMappings</param-name>
// <param-value>false</param-value>
// </init-param>
// 而是是用自定义的HandlerMapping,如果自定义了HandlerMapping的话
if (this.detectAllHandlerMappings) {
// 判断是否存在HandlerMapping,因为某些逻辑会注册一些HandlerMapping,例如加了下面两个标签,在web.xml解析中有讲到
// <mvc:default-servlet-handler/>
// <mvc:annotation-driven/>
Map<String, HandlerMapping> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
// 排序,保存
if (!matchingBeans.isEmpty()) {
this.handlerMappings = new ArrayList<>(matchingBeans.values());
AnnotationAwareOrderComparator.sort(this.handlerMappings);
}
}
else {
// 如果将detectAllHandlerMappings设置为了false,表示禁用自动检测和注册HandlerMapping
// 尝试去Spring容器中去拿单个配置name为handlerMapping的Bean
// @Bean("handlerMapping")
// public HandlerMapping handlerMapping() {
// return new RequestMappingHandlerMapping();
// }
// public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);
this.handlerMappings = Collections.singletonList(hm);
}
// 如果都没有配置,那么加载SpringMVC提供的默认的HandlerMapping
if (this.handlerMappings == null) {
// 默认的handlerMapping有三个
this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);{
// 加载spring-webmvc包下的DispatcherServlet.properties配置文件,这里提供了默认的
// 除了MultipartResolver的其他八大组件的默认对象
// private static final String DEFAULT_STRATEGIES_PATH = "DispatcherServlet.properties";
ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
Properties defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
}
}
for (HandlerMapping mapping : this.handlerMappings) {
// 默认都为false,除非设置了mapping.setPatternParser();
if (mapping.usesPathPatterns()) {
// 表示可以解析请求路径了
this.parseRequestPath = true;
break;
}
}
}
this.initHandlerAdapters(context);{
// 和handlerMapping完全一样的逻辑
// 自定义BeanName为 public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
}
// 以下四个,和initLocaleResolver完全一样,先成spring中获取,如果没有,就使用默认的
this.initHandlerExceptionResolvers(context);
this.initRequestToViewNameTranslator(context);
this.initViewResolvers(context);
this.initFlashMapManager(context);
}
}