前言
有时是否有些疑问,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
可以参考