正如我们所知,使用@RequestMapping
注释的处理程序方法允许具有非常灵活的签名,并且可以任意顺序。所以我们在 Controller 中可能有类似下面的方法
@RequestMapping(value = "/helloworld")
public String helloworld(){
...
}
或
@RequestMapping(value = "/helloworld")
public String helloworld(HttpServletResponse response, HttpServletRequest request){
...
}
或
@RequestMapping(value = "/helloworld")
public String helloworld(HttpServletRequest request, HttpServletResponse response){
...
}
Spring总能找到正确的方法来调用并传递正确的参数。我想知道幕后的实现,有人可以解释一下吗?提前致谢。
最佳答案
启动时,Spring 使用反射来扫描您的 @Controller
方法,查找那些用 @RequestMapping
注释的方法。它注册相应的Method
实例。它创建一个内部 map 样式的数据结构,以便它可以将请求 URL 与处理程序方法相匹配。
同时,它构造了一个 HandlerMethodArgumentResolver
的List
(某种形式)实例。这些是策略对象。 Spring 对每个 supported parameter type 都有一个实现.
一旦它具有处理程序方法,它就会获取其所有参数类型。它循环遍历 HandlerMethodArgumentResolver 列表,检查当前的 HandlerMethodArgumentResolver 是否支持参数类型。如果是,它使用它来解析用作参数的值。如果没有,则继续进行下一个。如果没有人能做到这一点,Spring 就会抛出异常。它收集所有这些值。 Spring 最终按顺序使用收集到的参数值对 Method
对象调用 invoke
。
关于java - @RequestMapping是如何实现支持灵活签名的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28618585/