Spring 源码解析之HandlerMapping源码解析(一)
来源:互联网 发布:新疆卫生系统网络直报 编辑:程序博客网 时间:2024/06/05 06:28
Spring 源码解析之HandlerMapping源码解析(一)
前言
这个是spring源码解析的第一篇,全文围绕着DispatcherServlet进行展开,Spring 的初始化基本都是通过DispatcherServlet进行初始化的,Spring boot除外,Spring boot是先初始化一个容器之后再初始化的DispatcherServlet,本文首先介绍Spring的HandlerMapping,本文的主要流程围绕着请求流程展开,而不是初始化流程,后续会按照流程的形式对源码进行解读,个人感觉这种方式比较容易理解。阅读源码的原因就是想了解Spring每个流程的实现,以及学习到更深层次的东西。
1.HandlerMapping功能分析
HandlerMapping是spring中最重要的一个类,主要功能就是为请求找到合适的处理器,现在Controller只是处理器的一种,目前我们自己公司自己实现了一套框架,前端js可以直接调用后端 soa service,忽略controller的存在,适合一些无用户状态的场景,比如说rest接口。
先来介绍下目前spring 已经提供的handlermapping
1.BeanNameUrlHandlerMapping
请求路径到bean name的映射
2.SimpleUrlHandlerMapping
最原始的spring使用方式,根struts差不多,通过配置请求路径对应处理的controller类,如下面例子
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3.ControllerBeanNameHandlerMapping
This is similar to BeanNameUrlHandlerMapping but doesn’t expect bean names to follow the URL convention: It turns plain bean names into URLs by prepending a slash and optionally applying a specified prefix and/or suffix. However, it only does so for well-known controller types, as listed above (analogous to ControllerClassNameHandlerMapping).
4.ControllerClassNameHandlerMapping
这个主要是类名映射,看看下面就知道了
* WelcomeController -> /welcome*
* HomeController -> /home*
这种方式通常搭配着MultiActionController
,比如/abc/to_add.do 这个表示调用AbcController.java下的to_add的方法。前提是AbcController.java继承MultiActionController
5.RequestMappingHandlerMapping(3.2之前是使用DefaultAnnotationHandlerMapping 这个去处理,但是后来弃用了)
这个就是现在默认的请求匹配方式,通过@RequestMapping 注解来决定调用方法和具体的类,也是最常用的一种。
DispatcherServlet初始化的时候会调用initHandlerMappings()
进行初始化
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
下面是初始化之后的一个状态,我这边使用的是spring boot启动,大致会初始化10个handlermapping,如下图所示:
下图可以看到,默认的
RequestMappingHandlerMapping
已经把所有路径映射进去,相关的spring拦截器也放到了RequestMappingHandlerMapping
中,由此说来,拦截器其实是跟RequestMappingHandlerMapping
进行关联的。
2. HandlerMapping流程分析
HandlerMapping流程需要弄清楚几个类的定义:
1. HandlerExecutionChain
(Handler execution chain, consisting of handler object and any handler interceptors. Returned by HandlerMapping’s)根据英文的翻译来说
HandlerExecutionChain
是 handler的执行链,由一些handler object 和 handler interceptors组成,这个里面包含了interceptor的所有执行,包括这个请求是否通过preHandle,大致逻辑如下
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
2. HandlerAdapter
HandlerAdapter
这个是spring的核心功能,所有的请求对应Controller方法都是通过HandlerAdapter 大该作用就是进行方法映射和调用并且返回结果,对应spring中正常用法实现类是HttpRequestHandlerAdapter
,一般基本的http请求都是通过这个进行处理的。
请求处理流程分析
先来看看这段代码,spring的核心。所有请求调用都是通过这里进行的,可以说是关键路径
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
下图是上述代码的一个大致流程
总结
遗留问题如下:
1. getHandler(processedRequest)
这个方法是如何查找到对应处理的HandlerExecutionChain和HandlerMapping的,比如说静态资源的处理和请求的处理肯定是不同的HandlerMapping
2. getHandlerAdapter(mappedHandler.getHandler());
如果取到对应的HandlerAdapter
- Spring 源码解析之HandlerMapping源码解析(一)
- Spring 源码解析之HandlerMapping源码解析(一)
- Spring 源码解析之HandlerMapping源码解析(一)
- 源码解析之路--spring解析(一)
- Spring源码之Resource加载源码解析(一)
- Spring源码解析之默认标签的解析(一)
- spring源码解析(一)
- Spring源码解析(一)
- spring源码aop解析(一)
- Spring源码解析--(一:源码导入Eclipse)
- springMVC源码--HandlerMapping(一)
- Spring源码解析(一) Spring事务控制之Hibernate
- Spring源码解析(一) Spring事务控制之Hibernate
- Spring源码解析(一) Spring事务控制之Hibernate
- Spring源码解析(一) Spring事务控制之Hibernate
- Spring源码解析(一) Spring事务控制之Hibernate
- Spring源码解析(一) Spring事务控制之Hibernate
- spring源码解析(一)迈向学习spring之路
- Android Shape绘制实用圆圈
- 一位资深程序员大牛给予Java初学者的学习路线建议
- BZOJ 2427: [HAOI2010]软件安装
- CentOS 7 YUM 10分钟快速安装 LNMP 环境详细教程
- Android TextView 自动排版工具类
- Spring 源码解析之HandlerMapping源码解析(一)
- 安装github
- Cloudera hadoop上的一些问题
- windows下安装配置Jenkins
- 【codevs 1001】舒适的路线
- div显示未展示内容,有条件的隐藏内筒
- Android--------工具类StatusBarUtil实现完美状态栏
- 数据库服务器构建和部署最佳实践
- 【牛客网】直通bat-面试算法精品课_第2章 排序 2.6 快速排序练习题(JAVA版)