版本:spring 3.0以上html
項目中有兩個spring的配置xml,以下java
${project.dir}\src\main\resources\META-INF\spring\applicationContext-service-database.xml ${project.dir}\src\main\webapp\WEB-INF\database-servlet.xml
項目中的web.xmlweb
${project.dir}\src\main\webapp\WEB-INF\web.xml
web.xml的配置以下:spring
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:META-INF/spring/applicationContext-service-database.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>database</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>database</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping>
具體查看文檔https://docs.spring.io/spring/docs/3.2.18.RELEASE/spring-framework-reference/htmlsingle/#mvc-introduction中17.2api
關鍵代碼:mvc
org.springframework.web.servlet.DispatcherServlet
private void initHandlerMappings(ApplicationContext context) { this.handlerMappings = null; if (this.detectAllHandlerMappings) { // Find all HandlerMappings in the ApplicationContext, including ancestor contexts. // BeanFactoryUtils.beansOfTypeIncludingAncestors 會去獲取容器B和它的父容器A中的HandlerMapping的接口實現,若是ContextLoaderListener已經配置了<mvc:annotation-driven/> // ,則直接使用ContextLoaderListener加載的HandlerMapping Map<String, HandlerMapping> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false); if (!matchingBeans.isEmpty()) { this.handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values()); // We keep HandlerMappings in sorted order. OrderComparator.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. // 若是在任何配置文件中都沒有配置spring mvc 功能,如:<mvc:annotation-driven/>,則會使用默認的HandlerMapping,默認的HandlerMapping是 //org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping, org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping // 相關默認配置請查看org\springframework\web\servlet\DispatcherServlet.properties if (this.handlerMappings == null) { this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class); if (logger.isDebugEnabled()) { logger.debug("No HandlerMappings found in servlet '" + getServletName() + "': using default"); } } }
這只是spring mvc 其中一個功能,其餘相關功能請查看DispatcherServlet中init*方法app