如何解决Spring MVC @Controller 的处理程序方法的参数如何在运行时自动解析?
dispatcherServlet
(或任何其他支持 Spring MVC 基础架构的 bean)如何动态解析 @Component
实例的处理程序方法的签名,以及它如何知道哪些参数/类型是预期的,按什么顺序,在那个方法中?
如果我有一个“@RequestMapping
-ed”处理程序方法,在我的 @Controller
实例中,定义其签名的任何版本:
public String f() {...}
public String f(Model model) {...}
public String f(HttpServletRequest,Model model) {...}
public String f(Model model,HttpServletRequest) {...}
public String f(SomeEntity se,Model model,HttpServletRequest,AnotherModel am) {...}
//so on..
可以正常工作,不考虑参数数量、类型和顺序,最终会提供相应的参数,再次 - 忽略它们的数量、顺序和类型。
下面应该有相当多的工作要做,正确实例化预期的参数,以正确的顺序传递它们,如果需要,甚至可以做一些类型转换......等等,但我不要掌握这个的基本原理。
我从 spring-webmvc
模块中查找了相应的源,以及 dispatcherServlet
的源;但是,还没有完全掌握底层机制。
我可以猜测,可能涉及到一些 BeanPostProcessor
......进行反射访问等等......但即使在这种情况下,由于我不确定发生了什么,我将非常感激任何有价值的输入。
解决方法
在 Spring MVC 中,HandlerMapping 有 3 个实现:BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping 和 ControllerClassNameHandlerMapping。 您可以在此处阅读有关此主题的更多信息: https://www.baeldung.com/spring-handler-mappings
,我已经很多年没有使用 Spring,但这篇文章提供了一个非常好的 spring mvc request lifecycle
当 DispatcherServlet 接收到一个请求时,它会遍历这个列表,直到找到一个与该请求匹配的处理程序对象。为简单起见,我们只考虑 RequestMappingHandlerMapping。
这种类型的 bean 存储@RequestMapping 注释方法(通过反射检索的实际 Method 对象)的映射,这些方法存储为 HandlerMethod 实例并包装在 RequestMappingInfo 对象中,这些对象包含用于匹配请求的映射数据,即。网址、标头和请求参数。
DispatcherServlet 从这些和您可能已注册的任何相应 HandlerInterceptor 实例中检索最匹配的 HandlerMethod。它将这些检索为 HandlerExecutionChain 对象。它将首先应用 HandlerInterceptors 的任何预处理。然后它将尝试调用您的 HandlerMethod。这通常(但不总是)是 @Controller 注释类中的 @RequestMapping 注释方法。这会产生 Spring 所说的调度结果。 DispatcherServlet 然后应用 HandlerInterceptors 的后处理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。