手写Spring MVC核心组件,底层原理如此简单

文摘   2024-12-02 18:00   新疆  

Spring Boot 3实战案例合集》现已囊括超过50篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

环境:SpringBoot3.2.5



1. 简介

Spring MVC的核心组件主要包括DispatcherServlet(前端控制器)、HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)、ViewResolver(视图解析器)等。这些组件共同协作,实现了请求的分发、处理及响应的生成。

DispatcherServlet 作为前端控制器请求的入口,所以这里我们不变。我们的焦点将集中在Spring MVC的另外两个核心组件上——HandlerMappingHandlerAdapter。通过亲自实践自定义这两个组件,我们将深入探索Spring MVC底层的工作机制。

先说明这两个核心组件的作用:

HandlerMapping:主要作用是将客户端的请求映射到具体的处理器(Handler)上。它根据请求的URL或其他标识符,确定应该由哪个处理器来处理该请求,并将处理器的信息返回给DispatcherServlet。

HandlerAdapter:则是一个适配器模式的实现,它负责将处理器和请求的处理过程结合起来。通过适配不同类型的处理器,HandlerAdapter使得Spring MVC能够支持多种处理器类型,包括普通的控制器、重定向控制器等。它充当了处理器和HandlerMapping之间的桥梁,确保请求能够正确地被处理器处理并返回结果。

本篇文章,我们将实现如下功能:

  • 自定义注解

    自定义@PackController标记处理器请求的接口,@PackRequest标记处理请求的具体方法。

  • 自定义HandlerMapping

    在该HandlerMapping中我们主要是解析处理所有使用@PackController注解的类及其中使用@PackRequest的方法。

  • 自定义HandlerAdapter

    该适配器用来调用由HandlerMapping返回的目标处理程序。

  • 参数解析

    实现简单的参数功能,以支持自动获取请求参数及类型转换。

      

    • 接下来,我们将详细逐步的实现以上功能。


2. 实战案例

2.1 自定义注解

@Retention(RUNTIME)@Target({ TYPE, METHOD })@Componentpublic @interface PackController {
}

注意:这里我们使用了@Component注解,这样Spring容器才能识别到我们当前的这个类为bean对象。

@Retention(RUNTIME)@Target({ METHOD })public @interface PackRequest {
/**请求URI*/ String value() default "" ;}

为了简单起见,我们不考虑其它请求属性,如:Method,Header等。仅仅就是通过请求的uri进行匹配。

@PackControllerpublic class UserController {
private final UserService userService ; public UserController(UserService userService) { this.userService = userService ; } @PackRequest("/query") public User query() { System.err.println(this.userService.query()) ; return new User(1L, "张三", 22) ; }}

最终,我们的接口定义如上,对于返回值类型,我们暂时都以JSON格式进行返回,不考虑其它情况。

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章