java - @RequestMapping是如何实现支持灵活签名的

标签 java spring-mvc annotations

正如我们所知,使用@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 与处理程序方法相匹配。

同时,它构造了一个 HandlerMethodArgumentResolverList(某种形式)实例。这些是策略对象。 Spring 对每个 supported parameter type 都有一个实现.

一旦它具有处理程序方法,它就会获取其所有参数类型。它循环遍历 HandlerMethodArgumentResolver 列表,检查当前的 HandlerMethodArgumentResolver 是否支持参数类型。如果是,它使用它来解析用作参数的值。如果没有,则继续进行下一个。如果没有人能做到这一点,Spring 就会抛出异常。它收集所有这些值。 Spring 最终按顺序使用收集到的参数值对 Method 对象调用 invoke

关于java - @RequestMapping是如何实现支持灵活签名的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28618585/

相关文章:

java - spring MVC 中的 validator 没有配置消息属性文件

java - 有没有办法在类的通用参数上使用 Eclipse 外部注释?

php 注释、命名空间和 use 关键字

java - 在 Java 字符串变量上使用 HTML

java.lang.UnsupportedClassVersionError : com/mysite/folders/Folders : Unsupported major. 次要版本 51.0

java - 无法读取任何包含特定字符的文件

types - 在比对模式中输入注解

java - 谁能看到我的程序中的无限循环在哪里?

javascript - 提交后复选框值不变

java - Spring MVC 窗体 :errors using Ajax