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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【一】springMVC之url和bean映射原理和源码解析 映射基本过程(1)springMVC配置映射,需要在xml配置文件中配置  (2)配置后,该配置将会交由org.springframework.web.servlet.config.MvcNamespaceHandler处理,该类会转交给org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser做解析。

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

相关文章
|
3月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
187 29
|
1月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot中使用拦截器——拦截器使用实例
本文主要讲解了Spring Boot中拦截器的使用实例,包括判断用户是否登录和取消特定拦截操作两大场景。通过token验证实现登录状态检查,未登录则拦截请求;定义自定义注解@UnInterception实现灵活取消拦截功能。最后总结了拦截器的创建、配置及对静态资源的影响,并提供两种配置方式供选择,帮助读者掌握拦截器的实际应用。
40 0
|
1月前
|
前端开发 JavaScript Java
微服务——SpringBoot使用归纳——Spring Boot中使用拦截器——拦截器的快速使用
本文介绍了在Spring Boot中使用拦截器的方法,包括拦截器的基本原理、定义与配置步骤。拦截器是AOP的一种实现,主要用于拦截对动态资源的请求,如判断用户权限或结合WebSocket使用。文章详细讲解了通过实现`HandlerInterceptor`接口来自定义拦截器,并重写`preHandle`、`postHandle`和`afterCompletion`三个核心方法。
58 0
|
5月前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
173 5
|
4月前
|
XML JSON JavaScript
HttpGet 请求的响应处理:获取和解析数据
HttpGet 请求的响应处理:获取和解析数据
|
5月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
447 2
|
5月前
|
前端开发 Java UED
SpringMVC全局异常处理+拦截器使用+参数校验
通过使用 SpringMVC 的全局异常处理、拦截器和参数校验,可以有效提升 Web 应用程序的安全性、稳定性和用户体验。这些技术的合理应用,不仅可以保证代码的健壮性,还能提高代码的可维护性,为开发高质量的 Web 应用程序提供了坚实的基础。
111 6
|
5月前
|
域名解析 网络协议 安全
反向DNS解析是从IP地址到域名的映射,主要作用于验证和识别,提高通信来源的可信度和可追溯性
在网络世界中,反向DNS解析是从IP地址到域名的映射,主要作用于验证和识别,提高通信来源的可信度和可追溯性。它在邮件服务器验证、网络安全等领域至关重要,帮助识别恶意行为,增强网络安全性。尽管存在配置错误等挑战,但正确管理下,反向DNS解析能显著提升网络环境的安全性和可靠性。
368 3
|
7月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
|
6月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
91 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现

推荐镜像

更多
下一篇
oss创建bucket