96SEO 2026-02-23 15:10 1
。

最后聊到了SpringMVC的九大组建的初始化#xff0c;以
HandlerMapping为例#xff0c;SpringMVC提供了三个实现了#xff0c;分别是#xff1a;BeanNameUrlHandlerMapping、RequestMappingHandlerMapping、RouterFunctio…
接上一遍博客《SpringMVC源码深度解析(上)》继续聊。
最后聊到了SpringMVC的九大组建的初始化以
HandlerMapping为例SpringMVC提供了三个实现了分别是BeanNameUrlHandlerMapping、RequestMappingHandlerMapping、RouterFunctionMapping其中最常用的就是
RequestMappingHandlerMapping与RequestMapping注解相关以它为例先看看类的继承图
可知该类实现了InitializingBean接口这是Spring的扩展点Bean对象在初始化的时候会调用
RequestMappingHandlerMapping#afterPropertiesSet()方法。
如果使用EnableWebMvc注解或者手动往Spring容器中注入
RequestMappingHandlerMapping对象Web容器在调用refresh()方法的过程中会调用afterPropertiesSet()方法如果不是通过以上两种方式的话由上一篇博客
《SpringMVC源码深度解析(上)》可知会读取dispatcherservlet.properties文件获取默认的HandlerMapping的实现类但是由于在前面已经调用了Web容器的refresh()方法完成了容器的刷新因此这里需要特殊处理代码如下
可知这里会显示的调用AutowireCapableBeanFactory#createBean()方法才会经历Bean的实例化与初始化才会调用
InitializingBean#afterPropertiesSet()方法。
我专门提到这个方法也侧面说明这个方法很重要看看这个方法代码如下
重点看看AbstractHandlerMethodMapping#getMappingForMethod()方法代码如下
再看看AbstractHandlerMethodMapping#registerHandlerMethod()方法代码如下
到这里为止就可以知道RequestMappingHandlerMapping在初始化的时候就会获取到所有被Controller/RequestMapping注解修饰的类并且得到该类中所有被Requestmapping注解修饰的方法每个被RequestMapping注解修饰的方法最终生成一个对应的HandlerMethod对象(存储被Controller/RequestMapping注解修饰的对象和被RequestMapping注解修饰的方法)并存储在内部类RequestMappingHandlerMapping.MappingRegistry的registry(Map)属性中key为RequestMappingInfo对象value为MappingRegistration对象(存储HandlerMethod对象)。
聊完了RequestMappingHandlerMapping在初始化再聊聊SpringMVC是如何处理请求。
其实就是要搞清楚DispatcherServlet的原理它是一个Servlet在《SpringMVC源码深度解析(上)》中也说到了创建了DispatcherServlet对象后会添加到Servlet容器中。
如果有请求来了会解析url并匹配如果是符合DispatcherServlet的匹配路径则调用
GenericServlet#service()方法这是一个抽象方法因此实际调用的是HttpServlet#service()方法代码如下
以POST请求为例则调用的是HttpServlet#doPost()方法代码如下
其实对于DispatcherServlet来讲不管是哪种请求最终都是调用FrameworkServlet#processRequest()方法代码如下
DispatcherServlet#doDispatch()方法是处理请求的核心会重点讲代码如下
在AbstractHandlerMethodMapping#lookupHandlerMethod()方法中主要是进行路径的匹配由于在前面RequestMappingInfoHandlerMapping初始化的时候已经存储好了所有的匹配路径及其HandlerMethod存放在
RequestMappingInfoHandlerMapping.MappingRegistry的pathLookup属性中因此如果满足匹配要求是可以获取到HandlerMethod对象的这块就说了涉及到匹配逻辑比较复杂感兴趣可以自己研究。
回到AbstractHandlerMapping#getHandler()方法中看看AbstractHandlerMapping#getHandlerExecutionChain()方法代码如下
可知这这个方法中就是创建HandlerExecutionChain对象并将HandlerInterceptor设置到HandlerExecutionChain对象的interceptorList属性中。
再回到DispatcherServlet#doDispatch()方法中代码如下
因此返回的HandlerAdapter对象是RequestMappingHandlerAdapter这里当用到的是适配器设计模式为什么要做适配呢还记得之前HandlerMapping由三个实现类的实际上处理的是三种不同的Controller因此需要有对应的适配器处理不同的情况看看HandlerAdapter#handle()方法就知道了具体如下
一种是被Controller/RestController/RequestMapping注解修饰的类
这三种情况的类都属于Controller因此需要不同的适配器处理我主要讲①剩下的两种有兴趣可以试试。
回到DispatcherServlet#doDispatch()方法继续往下看代码如下
执行拦截器的前置方法就是遍历HandlerExecutionChain的interceptorList属性执行HandlerInterceptor#preHandle()方法代码如下
false则直接return不往下走了。
在执行拦截器的前置方法后后置方法前会执行HandlerAdapter#handle()方法代码如下
顺便说一下RequestMappingHandlerAdapter也实现了InitializingBean接口因此也会实现afterPropertiesSet()方法代码如下
这里设置的这些默认处理器后续会用到包括参数的解析、绑定、返回值的处理等。
RequestMappingHandlerAdapter#invokeAndHandle()方法这里是执行目标类中目标方法的关键代码如下
以PathVariableMethodArgumentResolver为例看看代码如下
回到InvocableHandlerMethod#getMethodArgumentValues()方法看看是如何解析参数的主要看HandlerMethodArgumentResolverComposite#resolveArgument()方法代码如下
还是以PathVariableMethodArgumentResolver看看它的resolveArgument()方法代码如下
POST请求为http://127.0.0.1:9000/hello/sayHello/张三
最后将解析获取到的参数值放入Request的Attribute中。
当然除了这个之外常用的是在请求体中会放入Json数据最后参数中接受的是一个对象SpringMVC是怎么对Json格式的数据进行处理的呢这里是通过RequestResponseBodyMethodProcessor处理的代码如下
一共有八个转换器这是在哪里添加的呢后面讲EnableWebMvc注解的时候会讲到再看看HttpMessageConverter#read()方法代码如下
到这里可以知道接收的Java对象必须有Setter方法因为这里是直接通过反射调用Setter方法进行赋值的。
到这个为止完成了Json的解析以及对象的赋值即下图
还有一些其他的注解比如RequestParam感兴趣的自己研究。
InvocableHandlerMethod#invokeForRequest()参数处理完了再调用InvocableHandlerMethod#doInvoke()方法代码如下
反射调用玩目标方法后会有返回值也需要处理返回值。
回到ServletInvocableHandlerMethod#invokeAndHandle()方法代码如下
由于返回的是对象因此需要处理由于HelloController上添加的是RestController这个注解相当于ControllerResponseBody因此最终讲返回的对象反序列化为Json格式的数据并返回给前端。
这里还是需要看RequestResponseBodyMethodProcessor#handleReturnValue()方法代码如下
到这里为止把返回的对象进行序列化只是将其转成字符并缓存起来回到ObjectWriter#writeValue()方法代码如下
到这里为止SpringMVC的返回值处理讲完了SpringMVC剩下的内容将在下一篇博文中讲敬请期待~
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback