繁体   English   中英

Spring MVC @Controller 的处理程序方法的参数如何在运行时自动解析?

[英]How the Spring MVC @Controller's handler methods' parameters are automatically resolved during run-time?

DispatcherServlet (或任何其他 bean,支持 Spring MVC 基础设施)如何动态解析@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..

可以正常工作,无论参数编号、类型和顺序如何,最终都会与相应的 arguments 一起提供 -无论它们的数量、顺序和类型如何。

下面应该有相当多的工作,要正确实例化预期的 arguments,以正确的顺序传递它们,如果需要,甚至可以进行一些类型转换.. 等等,但我不掌握这个的基本原理。

我从spring-webmvc模块中查找了相应的来源,以及DispatcherServlet的来源; 但是,还没有牢牢掌握潜在的机制。

我可以猜到,可能会涉及到一些BeanPostProcessor .. 进行反射访问,等等.. 但即使在这种情况下,由于我不确定发生了什么,我非常感谢任何有价值的输入。

在 Spring MVC 中有 HandlerMapping 的三种实现:BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping 和 ControllerClassNameHandlerMapping。 您可以在此处阅读有关此主题的更多信息: https://www.baeldung.com/spring-handler-mappings

多年来我没有使用过 Spring,但是这篇文章给出了spring mvc 请求生命周期的一个很好的分步大纲

当 DispatcherServlet 接收到请求时,它会遍历此列表,直到找到与所讨论请求匹配的处理程序 object。 为简单起见,我们只考虑 RequestMappingHandlerMapping。

这种类型的 bean 存储 @RequestMapping 注释方法的映射(通过反射检索的实际方法 object)存储为 HandlerMethod 实例并包装在 RequestMappingInfo 对象中,该对象保存映射数据以匹配请求,即。 URL、标头和请求参数。

DispatcherServlet 从这些以及您可能已注册的任何相应 HandlerInterceptor 实例中检索最佳匹配的 HandlerMethod。 它将这些作为 HandlerExecutionChain object 检索。 它将首先应用 HandlerInterceptors 的任何预处理。 然后它将尝试调用您的 HandlerMethod。 这通常(但不总是)是 @Controller 注解的 class 内的 @RequestMapping 注解方法。 这会产生 Spring 所谓的调度结果。 然后 DispatcherServlet 应用 HandlerInterceptors 进行后期处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM