Spring源码解析四

上传人:我*** 文档编号:135986193 上传时间:2020-06-22 格式:DOC 页数:37 大小:106KB
返回 下载 相关 举报
Spring源码解析四_第1页
第1页 / 共37页
Spring源码解析四_第2页
第2页 / 共37页
Spring源码解析四_第3页
第3页 / 共37页
Spring源码解析四_第4页
第4页 / 共37页
Spring源码解析四_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《Spring源码解析四》由会员分享,可在线阅读,更多相关《Spring源码解析四(37页珍藏版)》请在金锄头文库上搜索。

1、下面我们对Spring MVC框架代码进行分析,对于webApplicationContext的相关分析可以参见以前的文档,我们这里着重分析Spring Web MVC框架的实现.我们从分析DispatcherServlet入手:如转载请注明,转载自:关注Javahttp:/本文链接:Spring源代码解析(四):Spring MVCJava代码1. /这里是对DispatcherServlet的初始化方法,根据名字我们很方面的看到对各个SpringMVC主要元素的初始化2. protectedvoidinitFrameworkServlet()throwsServletException,B

2、eansException 3. initMultipartResolver(); 4. initLocaleResolver(); 5. initThemeResolver(); 6. initHandlerMappings(); 7. initHandlerAdapters(); 8. initHandlerExceptionResolvers(); 9. initRequestToViewNameTranslator(); 10. initViewResolvers(); 11. 看到注解我们知道,这是DispatcherSerlvet的初始化过程,它是在WebApplicationCo

3、ntext已经存在的情况下进行的,也就意味着在初始化它的时候,IOC容器应该已经工作了,这也是我们在web.xml中配置Spring的时候,需要把DispatcherServlet 的 load-on-startup的属性配置为2的原因。对于具体的初始化过程,很容易理解,我们拿initHandlerMappings()来看看:Java代码1. privatevoidinitHandlerMappings()throwsBeansException 2. if(this.detectAllHandlerMappings) 3. /这里找到所有在上下文中定义的HandlerMapping,同时把他

4、们排序4. /因为在同一个上下文中可以有不止一个handlerMapping,所以我们把他们都载入到一个链里进行维护和管理5. MapmatchingBeans=BeanFactoryUtils.beansOfTypeIncludingAncestors( 6. getWebApplicationContext(),HandlerMapping.class,true,false); 7. if(!matchingBeans.isEmpty() 8. this.handlerMappings=newArrayList(matchingBeans.values(); 9. /这里通过order属性

5、来对handlerMapping来在list中排序10. Collections.sort(this.handlerMappings,newOrderComparator(); 11. 12. 13. else 14. try 15. Objecthm=getWebApplicationContext().getBean(HANDLER_MAPPING_BEAN_NAME,HandlerMapping.class); 16. this.handlerMappings=Collections.singletonList(hm); 17. 18. catch(NoSuchBeanDefinitio

6、nExceptionex) 19. /Ignore,welladdadefaultHandlerMappinglater.20. 21. 22. 23. /如果在上下文中没有定义的话,那么我们使用默认的BeanNameUrlHandlerMapping24. if(this.handlerMappings=null) 25. this.handlerMappings=getDefaultStrategies(HandlerMapping.class); 26. . 27. 28. 怎样获得上下文环境,可以参见我们前面的对IOC容器在web环境中加载的分析。 DispatcherServlet把

7、定义了的所有HandlerMapping都加载了放在一个List里待以后进行使用,这个链的每一个元素都是一个 handlerMapping的配置,而一般每一个handlerMapping可以持有一系列从URL请求到 Spring Controller的映射,比如SimpleUrlHandlerMaaping中就定义了一个map来持有这一系列的映射关系。DisptcherServlet通过HandlerMapping使得Web应用程序确定一个执行路径,就像我们在HanderMapping中看到的那样,HandlerMapping只是一个借口:Java代码1. publicinterfaceHan

8、dlerMapping 2. publicstaticfinalStringPATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE= 3. Conventions.getQualifiedAttributeName(HandlerMapping.class,pathWithinHandlerMapping); 4. /实际上维护一个HandlerExecutionChain,这是典型的Command的模式的使用,这个执行链里面维护handler和拦截器5. HandlerExecutionChaingetHandler(HttpServletRequestrequest)t

9、hrowsException; 6. 他的具体实现只需要实现一个接口方法,而这个接口方法返回的是一个HandlerExecutionChain,实际上就是一个执行链,就像在 Command模式描述的那样,这个类很简单,就是一个持有一个Interceptor链和一个Controller:Java代码1. publicclassHandlerExecutionChain 2. 3. privateObjecthandler; 4. 5. privateHandlerInterceptorinterceptors; 6. 7. . 8. 而这些Handler和Interceptor需要我们定义Han

10、dlerMapping的时候配置好,比如对具体的 SimpleURLHandlerMapping,他要做的就是根据URL映射的方式注册Handler和Interceptor,自己维护一个放映映射的handlerMap,当需要匹配Http请求的时候需要使用这个表里的信息来得到执行链。这个注册的过程在IOC容器初始化 SimpleUrlHandlerMapping的时候就被完成了,这样以后的解析才可以用到map里的映射信息,这里的信息和bean文件的信息是等价的,下面是具体的注册过程:Java代码1. protectedvoidregisterHandlers(MapurlMap)throwsBe

11、ansException 2. if(urlMap.isEmpty() 3. logger.warn(NeitherurlMapnormappingssetonSimpleUrlHandlerMapping); 4. 5. else 6. /这里迭代在SimpleUrlHandlerMapping中定义的所有映射元素7. Iteratorit=urlMap.keySet().iterator(); 8. while(it.hasNext() 9. /这里取得配置的url10. Stringurl=(String)it.next(); 11. /这里根据url在bean定义中取得对应的handl

12、er12. Objecthandler=urlMap.get(url); 13. /Prependwithslashifnotalreadypresent.14. if(!url.startsWith(/) 15. url=/+url; 16. 17. /这里调用AbstractHandlerMapping中的注册过程18. registerHandler(url,handler); 19. 20. 21. 在AbstractMappingHandler中的注册代码:Java代码1. protectedvoidregisterHandler(StringurlPath,Objecthandler)throwsBeansException,IllegalStateException 2. /试图从handlerMap中取handler,看看是否已经存在同样的Url映射关系3. ObjectmappedHandler=this.handlerMap.get(urlPath); 4. if(mappedHandler!=null) 5. . 6. 7. 8. /如果是直接用bean名做映射那就直接从容器中取handler9. if(!this.lazyInitHandlers&handlerinstance

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 事务文书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号