方法调用系统为Spring的Web技术栈提供了统一的机制来调用控制器处理方法。它处理方法执行的完整生命周期,包括参数解析、实际方法调用以及针对传统基于Servlet的Spring MVC和响应式Spring WebFlux应用的返回值处理。
有关HTTP消息处理和转换的信息,请参阅HTTP抽象和URI处理。有关响应式编程支持的详细信息,请参阅WebFlux和响应式编程。
方法调用系统围绕着一个类层次结构构建,这些类封装了处理方法并提供了调用能力。
基础的HandlerMethod类封装了控制器方法的信息,包括目标Bean实例、方法本身以及方法参数的元数据。每种Web技术都基于此进行扩展,以提供特定的调用能力。
来源:spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java70-471 spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java63-379 spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java79-419
方法调用始于解析目标处理方法的参数。此过程使用组合模式,将解析任务委托给特定的参数解析器。
参数解析过程会遍历每个方法参数,首先检查已提供的参数(通过类型直接匹配),然后委托给已配置的参数解析器。每个解析器都可以指示它是否支持特定的参数类型,并提供解析后的值。
来源:spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java204-238 spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java248-280
实际方法调用在传统实现和响应式实现之间有所不同,以适应不同的执行模型。
响应式实现返回一个Mono<HandlerResult>,表示方法执行的异步完成,而传统实现则同步执行并立即处理返回值。
来源:spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java175-196 spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java184-240 spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java114-144
返回值处理在传统实现和响应式实现之间有显著差异,尤其是在响应式类型的处理方式上。
ReactiveTypeHandler类通过将响应式返回值适配到基于Servlet的流式传输机制,从而在传统的Spring MVC中桥接响应式返回值。
该系统通过将响应式流转换为适当的发射器类型或延迟结果以进行异步处理,从而允许在Servlet环境中消费响应式流。
来源:spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java124-186 spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitterReturnValueHandler.java166-174
方法调用系统全面支持Kotlin语言特性,包括协程(coroutines)、值类(value classes)和可空类型(nullable types)。
Kotlin集成处理了几个语言特有的问题
CoroutinesUtils转换为响应式流null来源:spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java246-290 spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java324-417 spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java96-159
方法调用系统与Bean Validation集成,提供方法参数和返回值的自动验证。
当处理方法包含验证注解(@Valid、@Constraint注解)并且类没有使用@Validated注解时,验证会自动应用(后者会推迟到基于AOP的验证)。
来源:spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java402-469 spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java183-193 spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java188-196
方法调用系统是Spring MVC和WebFlux两者的基础,每种技术都扩展了基础功能以适应其特定的执行模型。
该系统在两种Web技术中提供了一致的编程模型,同时兼顾了它们执行模型的根本差异——同步的基于Servlet的处理与异步的响应式流。
来源:spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java66-327 spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java79-419 spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java78-586