猜您喜欢::暗渡陈仓上一句-暗渡陈仓上一句 清水川能源公司简介-清水川能源公司简介 宝坻艺考美术画室-宝坻艺考美术画室 泪盈于睫出处-泪盈于睫处 外事管理专业介绍(外事管理专业介绍) 孔板的流量计工作原理(孔板流量计原理) 宁波外事中职学费-宁波外事中职学费 梦见猫咬我手但没咬烂-梦被猫咬手未破 梦见被电击身亡-梦见被电击身亡 女孩起名开心快乐-女孩起名取悦开心快乐
聊聊 Spring MVC:别跟我讲那些教科书里都烂透的开场白 你让我写 Spring MVC 源码,我直接上点干货,把那些“起初、其次、最终”的废话全扔了。Spring 启动的时候,本质上就是搞了一套无限循环的监听器和回调机制,看好了。 启动流程实际上挺好办的,无非就是 `Application.run()` 这一招把容器、事件处理器和视图解析器全塞进去了。容器里最核心的就是 `DispatcherServlet`,它是那个总指挥,负责做各种转发和拦截。你要是不懂它,后续的路由配置、参数取、异常处理都绕不开它。 DispatcherServlet 的吞吞吐吐 Spring 的 MVC 核心就是 DispatcherServlet,它在启动时创建并配置好。它背后实际上是 Spring 的 IOC(依赖注入)和 AOP 算出来的结局。每次请求进来,`DispatcherServlet` 会先检查 `isIndex()` 看看是不是装配好的,要是是,就去调用 `HandlerMapping` 找映射器,再找 `HandlerAdapter` 把请求转成方式调用。 这里有个挺实际的数据,比如你写个 RestController,不用配置 stereotype,`HandlerMapping` 能自动识别 `@RestController = @RequestMapping(method = RequestMethod.GET)`。但这背后是 Spring 自动解析注解属性,把 `handler mapping` 和 `handler adapter` 绑在一起了。
要是你手动写个 `@Controller`,那就有了一级跳转和二级跳转,Spring 会多出两个 `HandlerMapping`。
这不仅是代码风格的难题,更是对请求路径的处理逻辑。 消息解析和参数取 拿到方式后,Spring 会调用 `HandlerMethodAdapter` 把方式参数当作对象注入进来。
要是是 RESTful 风格,参数可能直接透传要么当 JSON 序列化成对象。
要是是命令式,参数就是一般/平平 Java 对象。 参数取是个重头戏。Spring MVC 底层用的是 `@MethodArgument` 注解要么工具类 `MethodArgumentResolver`。
这个工具类挺了得,它能识别复杂的参数类型,比如 `@RequestParam` 能自动拆分成对象,`@PathVariable` 能识别 URL 片段里的字符串或对象。
有时候你就连不需求手动写,Spring 就能把 `request.getParameter()` 里的数据自动转成对应的 Model 对象,存入 `HandlerExecutionChain` 的 `MappedHandler` 里。 这里有个反例,要是你用 `@RequestParam("param1")` 指定参数名,但实际查询时传的是 `param1` 和 `param2`(逗号分隔),Spring 默认会按参数名拆分,不会按逗号分割。
这就是为啥有时候后端写死逻辑,前端传 JSON,参数解析会出错。 视图解析器的尴尬与重生 视图解析器是 MVC 最难搞的局部。Spring 默认用 `DefaultViewResolver`,它是通过配置 `viewResolver` 属性,把参数填进去,最终去找对应的视图。 举个例子,要是配置成 `org.springframework.web.servlet.view.AbstractViewResolver`,那就能自动解析 `@Model` 和 `@View`。但要是你手动写 `@RequestMapping("/api")`,路径解析就会变得挺怪,Spring 会当作这是一个全局的 REST 接口,而不是标准的 Controller 映射。 Spring 5.2 之后,引入了 `ViewResolver` 的私有接口,准自定义解析器。
比如你能够写个 `MyCustomViewResolver`,自己维护一个视图映射表,这样就能在 `@RequestMapping` 里通过 `@View` 指定具体的模板文件,而不需求依赖底层的 `ServletContext`。
这本质上就是让注解直接生效,而不是再去查配置文件。 异常处理和拦截链 异常处理也是 Spring 的一大特色。Spring MVC 有一个全局的异常处理器,默认是 `DefaultErrorHandler`。
要是方式抛出异常,它会拦截并转换为 HTTP 响应状态码。 比如 `@ExceptionHandler` 注解,回调函数能够接纳 `HttpServletRequest` 和 `HttpServletResponse`,把异常信息包装成 JSON 响应,要么直接回 `302 Found` 跳转。但要注意,自定义的异常处理器不能抛出异常,否则整个请求就会挂掉。 拦截器(Interceptor)则是更高级的管住。Spring 的 `Filter` 机制会让所有请求先流过拦截器链。你能够在 `DispatcherServlet` 里注册拦截器,比如做 CORS 配置、跨域校验要么埋点统计。但要注意,拦截器只能遮蔽异常,不能转变请求路由或参数。 总结 说到底,Spring MVC 源码就是一套复杂的回调和数据组合机制。`DispatcherServlet` 负责调度,`HandlerMapping` 负责找路,`HandlerAdapter` 负责转换,`ViewResolver` 负责渲染,`HandlerInterceptor` 负责管住。 不要试图去每一行注释都读懂。在实际开发中,记住这个核心逻辑:请求进来 -> 找映射器 -> 找适配器 -> 注入参数 -> 找视图 -> 回数据。至于那些内部的重构、缓存策略、线程池配置,都忒深了,不需求你细究,只要知道它是个“容器”就行了。 理解了这个,你的项目就能跑通,代码质量也能提升不少。别被那些 `@Autowired` 要么 `@ControllerAdvice` 搞晕了,实际上都是为了让这个庞大的系统自动装配起来。






