• 【spring源码学习】springMVC之映射,拦截器解析,请求数据注入解析,DispatcherServlet执行过程


    【一】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

  • 相关阅读:
    webpack(二)
    webpack(一)
    初探Vue SSR(1)
    Node版本管理控制器n
    Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner
    微信小程序分享参数传递
    关于vue-cli3.*搭建项目遇到问题整理
    请求头出现provisional headers are shown 和 vue-cli 3.x配置跨域代理
    HDU6409 没有兄弟的舞会
    HDU6446 Tree and Permutation
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/7268997.html
Copyright © 2020-2023  润新知