【一】springMVC之url和bean映射原理和源码解析 映射基本过程

(1)springMVC配置映射,需要在xml配置文件中配置<mvc:annotation-driven >  </mvc:annotation-driven>

(2)配置后,该配置将会交由org.springframework.web.servlet.config.MvcNamespaceHandler处理,该类会转交给org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser做解析。

(3)AnnotationDrivenBeanDefinitionParser做解析后,会向IOC容器中注册多个对象。其中有这个对象org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

(4)RequestMappingHandlerMapping对象在IOC实例化bean阶段,会调用该对象afterPropertiesSet()方法做url和bean的映射。

(5)该映射是从IOC中找到标注有@Controller,@RequestMapping注解的bean,然后反射所有的方法Mehod对象和注解中配置的url值进行映射。

(6)在org.springframework.web.servlet.DispatcherServlet初始化调用init()方法,在IOC解析,aop编制好后,会调用initStrategies(ApplicationContext context) 方法里调用initHandlerMappings(context)中。将IOC中所有实现HandlerMapping接口的bean注入到dispatcherServlet属性List<HandlerMapping> handlerMappings中

【二】springMVC拦截器的注入即应用的原理解析

(1)MvcNamespaceHandler在解析<mvc:annotation-driven ></mvc:annotation-driven>时向IOC容器中注册RequestMappingHandlerMapping

(2)MvcNamespaceHandler在解析<mvc:interceptors> </mvc:interceptors>时向IOC容器中注册一个个org.springframework.web.servlet.handler.MappedInterceptor拦截器对象

(3)RequestMappingHandlerMapping类是实现ApplicationContextAware接口的类,会在实例化的时候执行setApplicationContext(ApplicationContext context)方法,该方法内部初始化拦截器.将IOC容器中所有的MappedInterceptor对象赋值给RequestMappingHandlerMapping类的继承下来的属性private final List<MappedInterceptor> mappedInterceptors = new ArrayList<MappedInterceptor>();中

(4)未来在客户端发送请求,匹配到controller的时候会在RequestMappingHandlerMapping内部找到这个controller路径符合的拦截器,执行。并缓存起来。

【三】springMVC之请求数据注入Controller方法原理解析

(1)在加载IOC容器的时候,解析xml配置文件,解析到<mvc:annotation-driven >  </mvc:annotation-driven>配置后,会向IOC容器中注册一个对象org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

(2)同时会解析<mvc:message-converters register-defaults="true">配置,看是否有自定义的注入转换器。如果有,并且register-defaults=false,则就使用配置的注入转换器。如果register-defaults=true,则默认还会添加多个spring框架默认的注入转换器。将注入转换器加载到IOC容器中。举例如下(不全)

org.springframework.http.converter.ByteArrayHttpMessageConverter

org.springframework.http.converter.StringHttpMessageConverter

org.springframework.http.converter.ResourceHttpMessageConverter

org.springframework.http.converter.xml.SourceHttpMessageConverter

org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter

(3)将这些注入转换器形成一个集合。赋值给RequestMappingHandlerAdapter的属性messageConverters。

(4)在IOC容器实例化RequestMappingHandlerAdapter的方法的时候,会调用afterPropertiesSet()方法做初始化操作。会将注入器包装成 RequestResponseBodyMethodProcessor对象放入List<HandlerMethodArgumentResolver>,赋值给this.argumentResolvers属性。

(5)在网络请求过来的时候,会根据反射得到要执行的controller方法的参数列表。根据参数列表,找到合适的HttpMessageConverter去从HttpserveltRequest中读取请求体,然后进行参数组装。将所有的参数列表组装成数据。然后反射执行Controller方法。
(6)执行完Controller的方法后,会调用属性returnValueHandlers(也会把HttpMessageConverter包装RequestResponseBodyMethodProcessor对象加入List<HandlerMethodReturnValueHandler> handlers中赋值给该属性)。进行相应的回调操作。

【四】DispatcherServlet执行网络请求,转发致Controller的大致过程

(1)几个关键的对象

==>org.springframework.web.servlet.HandlerMapping接口实现类org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

>>该对象是做url和controller的映射作用。同时还存放了拦截器的配置。

 >>在解析xml配置 <mvc:annotation-driven >时候spring会编码方式注入IOC容器,在IOC容器实例化的时候会调用afterPropertiesSet()方法初始化映射关系。调用setApplicationContext()方法的时候初始化拦截器配置。

==>org.springframework.web.servlet.HandlerAdapter接口实现类org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

  >>该对象包换了http请求注入转换器,http响应注入转换器。

(2)DispatcherServlet执行过程

==>http请求进入,先通过HttpServeleRequest对象从DispatcherServlet属性List<HandlerMapping> handlerMappings中获取拦截器链子,请求执行的Controller包装类HandlerExecutionChain mappedHandler。

==>然后根据HandlerExecutionChain mappedHandler 从List<HandlerAdapter> handlerAdapters中获取一个RequestMappingHandlerAdapter

==>执行拦截器请求前的方法preHandle方法

==>RequestMappingHandlerAdapter调用handle方法执行请求。(注入,反射执行controller方法)

==>执行拦截器请求前的方法postHandle方法

【五】<mvc:annotation-driven >  </mvc:annotation-driven>配置,由AnnotationDrivenBeanDefinitionParser解析会在IOC中注册的bean大致如下

【1】org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
属性:
org.springframework.web.accept.ContentNegotiationManagerFactoryBean

【2】org.springframework.web.bind.support.ConfigurableWebBindingInitializer
属性:
org.springframework.format.support.FormattingConversionServiceFactoryBean
org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean

【3】org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
属性:
contentNegotiationManager:org.springframework.web.accept.ContentNegotiationManagerFactoryBean
webBindingInitializer:  org.springframework.web.bind.support.ConfigurableWebBindingInitializer
messageConverters : 下面

【4】<mvc:message-converters register-defaults="true">
==>org.springframework.http.converter.ByteArrayHttpMessageConverter(默认加载)
==>org.springframework.http.converter.StringHttpMessageConverter(默认加载)
==>com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter(配置)

==>org.springframework.http.converter.ResourceHttpMessageConverter(默认加载)
==>org.springframework.http.converter.xml.SourceHttpMessageConverter(默认加载)
==>org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter(默认加载)

==> org.springframework.http.converter.feed.AtomFeedHttpMessageConverter(不加载)
==>org.springframework.http.converter.feed.RssChannelHttpMessageConverter(不加载)

==>org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter(不加载)
==>org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter(默认加载)
==>org.springframework.http.converter.json.GsonHttpMessageConverter(不加载)

【5】org.springframework.web.servlet.config.CompositeUriComponentsContributorFactoryBean
属性:
handlerAdapter:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
conversionService:org.springframework.format.support.FormattingConversionServiceFactoryBean

【6】org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor
【7】org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver
【8】org.springframework.web.servlet.handler.MappedInterceptor
【9】org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver
【10】org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
【11】org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
【12】org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
【13】org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter

【spring源码学习】springMVC之映射,拦截器解析,请求数据注入解析,DispatcherServlet执行过程的更多相关文章

  1. Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md

    写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...

  2. 【目录】Spring 源码学习

    [目录]Spring 源码学习 jwfy 关注 2018.01.31 19:57* 字数 896 阅读 152评论 0喜欢 9 用来记录自己学习spring源码的一些心得和体会以及相关功能的实现原理, ...

  3. Spring 源码学习——Aop

    Spring 源码学习--Aop 什么是 AOP 以下是百度百科的解释:AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程通过预编译的方式和运行期动态代理实 ...

  4. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  5. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  6. spring源码学习之路---深入AOP(终)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...

  7. spring源码学习之路---IOC初探(二)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章当中我没有提及具体的搭 ...

  8. Spring源码学习

    Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...

  9. Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签

    写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...

  10. Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作

    写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读 ...

随机推荐

  1. 20145235李涛《网络对抗》Exp8 Web基础

    基础问答 什么是表单 可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单包括两个部分:一部分是HTML源代码用于描述表单(例如,域,标签和用户在页面上看见的按钮),另一部分是脚本 ...

  2. 20162305李昱兴 2016-2017-2 《Java程序设计》第2周学习总结

    20162305 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 教材的第二章以数据和表达式为主.在第二章的学习中,我了解了print以及println的用法 ...

  3. React Native集成Redux框架讲解与应用

    学过React Native的都知道,RN的UI是根据相应组件的state进行render的,而页面又是由大大小小的组件构成,导致每个组件都必须维护自身的一套状态,因此当页面复杂化的时候,管理stat ...

  4. 记一次如何解决低版本jar包里面的bug,不适宜替换成高版本的经历

    背景:目前正在迭代开发的项目,应用户要求新增一个电子文档转换的功能,即将不标准的excel文件转换为标准的excel文件(标准模板). 选择:pio ,本项目里面本来就有poi的jar包 问题:项目里 ...

  5. Floyd算法 - 最短路径

    2017-07-27 22:21:04 writer:pprp 该算法的本质是动态规划,形式简单,复杂度高为O(n^3): d[i][j] = max(d[i][k]+d[k][j],d[i][j]) ...

  6. var与this定义变量的区别以及疑惑

    我们知道: var可以定义一个局部变量,当然如果var定义在最外层的话,就是全局的局部变量,也就算是全局变量了. 而this关键字定义的变量准确的说应该算是成员变量.即定义的是调用对象的成员变量. 另 ...

  7. DIKW:数据、信息、知识、智慧的金字塔层次体系

    http://www.ciotimes.com/ProCase/85417.html 前言 知识对于个人.组织的重要性已经不言而喻.可以说,管理与应用知识的能力已经成为企业的核心竞争力. 知识如此重要 ...

  8. Three.js基础:导入STL模型文件

    stlloadertest.html: <!DOCTYPE html> <html lang="en"> <head> <title> ...

  9. pOJ-1061 exgcd求同余方程组

    链接 就是求(m-n)*a+b*l=y-x, 类似于求解a*x+b*y=c,r=gcd(a,b),当c%r==0时有解,用exgcd求出a*x+b*y=gcd(a,b)的解,然后x*c/gcd(a,b ...

  10. Codeforces Round #299 (Div. 2)D. Tavas and Malekas

    KMP,先预处理按每个节点标记,扫一遍更新每个匹配位置,最后kmp判断是否有重合而且不相同的地方 注意处理细节,很容易runtime error #include<map> #includ ...