org.springframework.web.servlet.DispatcherServlet#initStrategies
org.springframework.web.servlet.DispatcherServlet#initHandlerMappings
private void initHandlerMappings(ApplicationContext context) { this.handlerMappings = null; //默认为true if (this.detectAllHandlerMappings) { // Find all HandlerMappings in the ApplicationContext, including ancestor contexts. //从容器里获取HandlerMapping的bean,那么这个HandlerMapping是在什么时候注入容器的呢? //原来是 <mvc:annotation-driven></mvc:annotation-driven>开启了这个注解 //org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#parse Map<String, HandlerMapping> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false); if (!matchingBeans.isEmpty()) { this.handlerMappings = new ArrayList<>(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. //如果没有handlerMappings则读取环境变量下的默认配置文件DispatcherServlet.properties if (this.handlerMappings == null) { this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class); if (logger.isTraceEnabled()) { logger.trace("No HandlerMappings declared for servlet '" + getServletName() + "': using default strategies from DispatcherServlet.properties"); } }
总结:从容器里获取HandlerMapping的bean,那么这个HandlerMapping是在什么时候注入容器的呢? 原来是 mvc:annotation-driven/mvc:annotation-driven开启了这个注解 org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#parse
这里注册了2个bean
1.
RootBeanDefinition handlerMappingDef = new RootBeanDefinition(RequestMappingHandlerMapping.class);
2.
// Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off" MvcNamespaceUtils.registerDefaultComponents(context, source);
至此2个bean已经注册到容器完成
解析完之后会在这里使用,通过处理器映射器找到对应的处理器适配器
org.springframework.web.servlet.DispatcherServlet#getHandler
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { if (this.handlerMappings != null) { for (HandlerMapping mapping : this.handlerMappings) { HandlerExecutionChain handler = mapping.getHandler(request); if (handler != null) { return handler; } } } return null; }
总结:通过初始化9大组件,然后开启 mvc:annotation-driven/mvc:annotation-driven,最后通过spring的api函数手动注入2个HandlerMapping,分别是RequestMappingHandlerMapping和BeanNameUrlHandlerMapping