文章目录

  • 前言
  • controller
  • 实现原理
  • 按顺序讲解实现原理
  • 你想往mvc添加自己的实现注解controller


前言

有时是否有些疑问,mvc controller是怎么实现的,或者说有没有需求让你将所有api收集起来,有点像api文档那种?

一般的思路
controller实现方案会有map,来保存url,以及对应调用类、方法、参数。
然后api收集的话,会考虑通过反射,收集对应的注解来拿到这些controller的信息

实际上
controller实现方案也是这么实现的
api信息收集的话mvc已经帮我们实现了,接下来的重点看下spring mvc是怎么实现controller

controller

spring mvc controller控制器 springmvc的controller原理_参数类型


上面就是我们平时会用到普遍的用法,有post、get请求

实现原理

RequestMappingHandlerMapping
它继承 AbstractHandlerMethodMapping

AbstractHandlerMethodMapping里头有什么?
private final MappingRegistry mappingRegistry
那我们来获取一下,看下药里面塞的是什么葫芦

spring mvc controller控制器 springmvc的controller原理_java_02


通过反射来获取实例里头的属性

spring mvc controller控制器 springmvc的controller原理_java_03


mapperlookup里面有所有url

spring mvc controller控制器 springmvc的controller原理_spring_04


再进去,一个循环里头,会有对应的url、bean、方法名,returnType,参数类型等等

那么我们可以知道AbstractHandlerMethodMapping mappingRegistry 有mvc所有请求路径信息!

按顺序讲解实现原理

上面是直接说结果了,所以下面按顺序来梳理下实现原理

  1. AbstractHandlerMethodMapping 实现了 InitializingBean,调用initHandlerMethods方法
  2. 它会遍历所有类
  3. spring mvc controller控制器 springmvc的controller原理_参数类型_05

  4. isHandler方法会去判断是否符合条件,符合的话会处理。有没有很熟悉的注解
  5. spring mvc controller控制器 springmvc的controller原理_参数类型_06

spring mvc controller控制器 springmvc的controller原理_实现原理_07

  1. 如果有这样的注解,会跳进detectHandlerMethods方法,会拿到对应方法以及mapping
  2. spring mvc controller控制器 springmvc的controller原理_mvc_08

  3. registerHandlerMethod方法
  4. spring mvc controller控制器 springmvc的controller原理_spring_09


  5. spring mvc controller控制器 springmvc的controller原理_参数类型_10

  6. 最后往AbstractHandlerMethodMapping registry塞数据,其实也就是我们之前说的结果

你想往mvc添加自己的实现注解controller

  1. 改下AbstractHandlerMethodMapping isHandler方法
  2. 改下构造请求info的方法getMappingForMethod

可以参考