文章目录
- 前言
- controller
- 实现原理
- 按顺序讲解实现原理
- 你想往mvc添加自己的实现注解controller
前言
有时是否有些疑问,mvc controller是怎么实现的,或者说有没有需求让你将所有api收集起来,有点像api文档那种?
一般的思路
controller实现方案会有map,来保存url,以及对应调用类、方法、参数。
然后api收集的话,会考虑通过反射,收集对应的注解来拿到这些controller的信息
实际上
controller实现方案也是这么实现的
api信息收集的话mvc已经帮我们实现了,接下来的重点看下spring mvc是怎么实现controller
controller
上面就是我们平时会用到普遍的用法,有post、get请求
实现原理
RequestMappingHandlerMapping
它继承 AbstractHandlerMethodMapping
AbstractHandlerMethodMapping里头有什么?
private final MappingRegistry mappingRegistry
那我们来获取一下,看下药里面塞的是什么葫芦
通过反射来获取实例里头的属性
mapperlookup里面有所有url
再进去,一个循环里头,会有对应的url、bean、方法名,returnType,参数类型等等
那么我们可以知道AbstractHandlerMethodMapping mappingRegistry 有mvc所有请求路径信息!
按顺序讲解实现原理
上面是直接说结果了,所以下面按顺序来梳理下实现原理
- AbstractHandlerMethodMapping 实现了 InitializingBean,调用initHandlerMethods方法
- 它会遍历所有类
- isHandler方法会去判断是否符合条件,符合的话会处理。有没有很熟悉的注解
- 如果有这样的注解,会跳进detectHandlerMethods方法,会拿到对应方法以及mapping
- registerHandlerMethod方法
- 最后往AbstractHandlerMethodMapping registry塞数据,其实也就是我们之前说的结果
你想往mvc添加自己的实现注解controller
- 改下AbstractHandlerMethodMapping isHandler方法
- 改下构造请求info的方法getMappingForMethod
可以参考