SpringMVC扩展点

SpringMVC扩展点
ShioSpringMVC扩展点
- DispatchServlet:
- 这是Spring MVC的核心控制器,负责处理所有的HTTP请求和响应。它根据请求的URL来决定调用哪个处理器(Controller中的方法),并最终返回响应给客户端。
 - 它使用
HandlerMapping来确定具体的请求应该由哪个处理器方法来处理。 
 - HandlerMapping:
- 这个接口定义了如何将HTTP请求映射到处理器方法。
RequestMappingHandlerMapping是HandlerMapping的一个实现,它使用注解(如@RequestMapping)来映射URL到具体的处理器方法。 
 - 这个接口定义了如何将HTTP请求映射到处理器方法。
 - HandlerAdapter:
- 这个接口定义了如何调用处理器方法。
RequestMappingHandlerAdapter是HandlerAdapter的一个实现,它负责调用与@RequestMapping注解的URL匹配的处理器方法。 
 - 这个接口定义了如何调用处理器方法。
 - RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter:
- 这两个组件是Spring MVC中处理基于注解的映射的核心。
RequestMappingHandlerMapping负责查找和匹配URL到相应的处理器方法,而RequestMappingHandlerAdapter负责实际调用这些方法。 
 - 这两个组件是Spring MVC中处理基于注解的映射的核心。
 - MappingRegistry:
- 这是一个注册表,用于存储URL模式和对应的处理器方法。它使得
RequestMappingHandlerMapping能够快速查找匹配的处理器方法。 
 - 这是一个注册表,用于存储URL模式和对应的处理器方法。它使得
 - HandlerMethodArgumentResolver 和 HandlerMethodReturnValueHandler:
- 这两个接口定义了如何处理进入和返回自处理器方法的数据。
HandlerMethodArgumentResolver用于解析方法参数,例如将URL中的占位符(如{id})转换为方法参数的值。 HandlerMethodReturnValueHandler用于处理方法的返回值,将其转换为适合HTTP响应的形式。
 - 这两个接口定义了如何处理进入和返回自处理器方法的数据。
 - PathVariableMethodArgumentResolver 和 RequestResponseBodyMethodProcessor:
- 这些是具体的解析器和处理器,用于处理特定的数据类型。
PathVariableMethodArgumentResolver用于解析URL路径变量,而RequestResponseBodyMethodProcessor用于处理请求体和响应体,例如将JSON或XML数据绑定到Java对象,或将Java对象序列化为JSON或XML。 
 - 这些是具体的解析器和处理器,用于处理特定的数据类型。
 - MappingJackson2HttpMessageConverter:
- 这是一个消息转换器,用于将HTTP请求和响应体与Java对象之间进行转换。它通常用于处理JSON数据,将JSON字符串转换为Java对象,或将Java对象转换为JSON字符串。
 
 - MultiValueMap<String, T>:
- 这是一个泛型接口,用于表示HTTP请求中参数的映射,其中键是参数名,值是参数值的列表。这允许处理具有相同名称的多个参数的情况。
 
 
这些组件通过它们的接口和实现类相互协作,形成了Spring MVC的请求处理流程。当一个HTTP请求到达时,DispatchServlet会使用HandlerMapping来确定请求应该由哪个处理器方法处理,然后通过HandlerAdapter来调用这个方法。参数和返回值的处理由HandlerMethodArgumentResolver和HandlerMethodReturnValueHandler负责。最终,请求被正确地处理并返回给客户端。
一般需要扩展的地方包括:
HandlerMethodArgumentResolver
可以定制自己的参数接收方式 和@PathVariable同级HandlerMethodReturnValueHandler
定制返回方式,和@ResponseBody同级MessageConverter
如果采用@ResponseBody,可以根据不同的Class和MediaType定制不同的Converter
HandlerMethodArgumentResolver
HandlerMethodArgumentResolver接口是Spring MVC中用于解析和提供处理器方法参数的组件。如果你想自定义参数的接收方式,可以通过实现这个接口来创建自己的参数解析器。下面是一个简单的代码示例,展示了如何创建一个自定义的HandlerMethodArgumentResolver来解析请求头中的参数:
import org.springframework.core.MethodParameter;  | 
在这个示例中,我们创建了一个名为CustomHeaderArgumentResolver的类,它实现了HandlerMethodArgumentResolver接口。我们定义了一个名为CUSTOM_HEADER_NAME的常量来指定我们要解析的请求头的名称。
supportsParameter方法检查方法参数是否有CustomHeader注解。这是一个自定义注解,你可以创建它来标记需要从请求头中解析的参数。
resolveArgument方法是实际解析参数的地方。我们从NativeWebRequest中获取HttpServletRequest对象,然后调用getHeader方法来获取请求头中的值。最后,我们将这个值返回给Spring MVC,它将把这个值作为参数传递给处理器方法。
为了使用这个自定义的参数解析器,你需要将其添加到Spring MVC的解析器列表中。这通常在Spring配置文件中完成,如下所示:
@Configuration  | 
现在,当你在控制器方法中使用@CustomHeader注解标记的参数时,Spring MVC将会使用我们自定义的CustomHeaderArgumentResolver来解析这个参数。
@RestController  | 
在这个控制器方法中,customHeaderValue参数将通过我们自定义的HandlerMethodArgumentResolver来获取请求头中X-Custom-Header的值。
HandlerMethodReturnValueHandler
HandlerMethodReturnValueHandler接口允许开发者自定义Spring MVC处理器方法的返回值处理逻辑。以下是一个简单的代码示例,展示了如何实现这个接口来自定义返回值的处理:
首先,我们创建一个自定义的HandlerMethodReturnValueHandler实现类,用于处理返回值为String类型的方法:
import org.springframework.core.MethodParameter;  | 
在这个实现中,supports方法检查返回类型是否为String。如果是,那么这个HandlerMethodReturnValueHandler将被用于处理返回值。
beforeBodyWrite方法是实际处理返回值的地方。在这个方法中,我们可以自定义返回值的处理逻辑。在这个例子中,我们检查返回的body是否为String类型,如果是,我们添加了一些自定义的前缀文本。
接下来,我们需要将这个自定义的HandlerMethodReturnValueHandler注册到Spring MVC中:
import org.springframework.context.annotation.Configuration;  | 
在WebConfig配置类中,我们通过实现WebMvcConfigurer接口并重写addReturnValueHandlers方法,将我们的CustomStringReturnValueHandler添加到Spring MVC的返回值处理器列表中。
现在,当控制器方法返回一个String类型的值时,我们的自定义HandlerMethodReturnValueHandler将会被调用来处理这个返回值:
@RestController  | 
在这个例子中,exampleMethod方法返回的字符串”Hello, World!”将会被CustomStringReturnValueHandler处理,最终响应给客户端的内容将是”Custom String: Hello, World!”。这样,我们就成功地自定义了返回值的处理逻辑。
MessageConverter
MessageConverter接口是Spring MVC中用于在请求和响应之间转换数据格式的组件。以下是一个简单的代码示例,展示了如何实现MessageConverter接口来创建一个自定义的消息转换器,它将自定义的MyObject类实例转换为JSON字符串,并从JSON字符串中反序列化出MyObject实例。
首先,我们定义一个简单的MyObject类,它将被序列化和反序列化:
public class MyObject {  | 
接下来,我们创建一个自定义的MessageConverter实现类:
import org.springframework.http.MediaType;  | 
在这个实现中,我们继承了MappingJackson2HttpMessageConverter,它是一个基于Jackson库的JSON消息转换器。我们重写了supports方法来指定我们的转换器只处理MyObject类型的类,并且只支持我们自定义的MY_OBJECT_MEDIA_TYPE媒体类型。
我们还重写了readInternal和writeInternal方法,虽然在这个例子中我们只是调用了父类的方法,但这些方法是你可以自定义序列化和反序列化逻辑的地方。
最后,我们重写了getSupportedMediaTypes方法来返回我们的转换器支持的媒体类型列表。
为了注册我们的自定义MessageConverter,我们需要在Spring配置中添加它:
import org.springframework.context.annotation.Configuration;  | 
在这个配置类中,我们通过实现WebMvcConfigurer接口并重写configureContentNegotiation和extendMessageConverters方法,将我们的CustomMyObjectConverter添加到Spring MVC的消息转换器列表中,并配置了内容协商。
现在,当控制器方法返回一个MyObject类型的值,并且请求的Accept头或URL路径扩展名指定了application/x-my-object类型时,Spring MVC将使用我们的自定义MessageConverter来处理这个返回值。同样,当客户端发送application/x-my-object类型的请求体时,我们的转换器也会被用来解析请求体中的MyObject实例。
springMVC 扩展点 - 刃牙 - 博客园 (cnblogs.com)
SpringMVC中HandlerMapping和HandlerAdapter详解(适配器模式)_handlermapping和handler adatper-CSDN博客

















