文章目录

    • 一、设计哲学:分层与解耦
      • 1. 前端控制器模式
      • 2. 分层架构设计
    • 二、核心组件源码解析
      • 1. DispatcherServlet - 九大组件初始化
      • 2. DispatcherServlet - 前端控制器(请求处理中枢)
        • 请求源码入口:FrameworkServlet#doGet()
        • 请求委托分发:DispatcherServlet#doService()
        • 核心请求处理:DispatcherServlet#doDispatch()
      • 3. HandlerMapping - 请求映射处理器(请求路由引擎)
      • 4. HandlerAdapter - 处理器适配器
      • 5. HandlerMethodArgumentResolver - 参数解析器
      • 6. HandlerMethodReturnValueHandler - 返回值处理器
      • 7. RequestToViewNameTranslator - 视图名转换器
      • 8. HandlerExceptionResolvers - 异常解析器
      • 9. ViewResolver - 视图解析器(渲染视图)
      • 10. LocaleResolver - 地区区域解析器(国际化i18n)
    • 三、请求处理全流程剖析
      • 关键流程说明:
    • 四、核心设计模式应用
      • 1. 策略模式(组件可插拔)
      • 2. 模板方法模式(流程标准化)
      • 3. 责任链模式(拦截器栈)
    • 五、扩展机制实战
      • 1. 自定义参数解析器
      • 2. 自定义视图解析器
    • 六、性能优化设计
      • 1. 映射缓存机制
      • 2. 快速失败机制
      • 3. 性能优化方案
    • 七、Spring MVC 设计精髓总结
    • 扩展

Spring MVC作为Java Web开发的标杆框架,其优雅的设计思想和可扩展架构值得我们深入探究。它是 Spring 框架的核心模块,采用了经典的前端控制器模式,本文将结合核心源码,揭示其内部工作机制。

关于Spring MVC上下文容器DispatcherServlet 容器)的启动-创建-初始化,可以参阅文章:【Spring MVC上下文容器在Web容器中是如何启动的(源码深入剖析)?】

一、设计哲学:分层与解耦

1. 前端控制器模式

Spring MVC 是 Spring 框架的核心模块,Spring MVC采用了经典的前端控制器模式,通过高度组件化的设计实现职责分离和可扩展性:
在这里插入图片描述

核心设计原则:

  1. 单一职责:每个组件只负责特定功能
  2. 开闭原则:通过接口扩展而非修改
  3. 分层处理:请求处理流程清晰分层

DispatcherServlet 作为统一入口,接收所有 HTTP 请求;通过策略接口将请求处理职责分发给不同组件

2. 分层架构设计

在这里插入图片描述

  • 控制层(Controller):处理请求,协调业务逻辑
  • 业务层(Service):实现核心业务逻辑
  • 数据层(DAO):处理数据持久化
  • 视图层(View):渲染响应结果

二、核心组件源码解析

1. DispatcherServlet - 九大组件初始化

源码路径org.springframework.web.servlet.DispatcherServlet
核心方法initStrategies
在这里插入图片描述

初始化文件解析器:initMultipartResolver()

在这里插入图片描述

  • 组件主要作用:文件上传解析器的作用是将 multipart/form-data 类型的请求解析为普通的表单字段和文件字段,便于后续处理。
  • 标准实现类StandardServletMultipartResolver
    • MultipartResolver 接口的标准实现
    • 基于 Servlet 3.0 的 javax.servlet.http.Part API
    • 需要在 web.xml 或通过编程方式配置 Servlet 的 "multipart-config"
  • 核心功能源码
    1. 多部分请求检测 - 通过 isMultipart() 方法检查请求内容类型是否为 "multipart/"
      在这里插入图片描述
    2. 多部分请求解析 - 使用 resolveMultipart() 方法将普通请求转换为 MultipartHttpServletRequest
      在这里插入图片描述
    3. 资源清理 - 通过 cleanupMultipart() 方法删除上传的临时文件
      在这里插入图片描述

初始化地区区域解析器(国际化i18n):initLocaleResolver()

在这里插入图片描述

  • 组件主要作用:用于根据请求确定当前的区域设置(Locale)。它允许应用程序支持国际化本地化功能,例如根据用户的语言偏好显示内容。,LocaleResolver 的默认实现是 AcceptHeaderLocaleResolver,它通过 HTTP 请求头中的 Accept-Language 来解析用户的区域设置。
  • 默认实现类org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
    • 实现了 LocaleResolver 接口
    • 基于 HTTP 请求头中的 "Accept-Language" 字段来确定客户端的区域设置
    • 这是 Spring MVC 默认的区域解析器
  • 核心功能
    • 支持的区域列表: 可通过 setSupportedLocales() 方法配置支持的区域列表进行匹配
    • 默认区域设置: 可通过 setDefaultLocale() 方法设置当请求中没有 Accept-Language 头时的默认区域
    • 智能匹配机制:
      • 优先匹配完整的语言和国家/地区组合
      • 当没有完全匹配时,会尝试匹配语言部分
      • 按照请求中 Accept-Language 头的优先级顺序进行匹配

初始化主题解析器:initThemeResolver()

在这里插入图片描述

  • 组件主要作用:根据请求确定当前的主题(例如页面的样式或布局);默认的 FixedThemeResolver 会固定使用一个主题,无法动态切换。用处不大😂。
  • 默认实现类org.springframework.web.servlet.theme.FixedThemeResolver
    • 继承自 AbstractThemeResolver
    • 实现了 ThemeResolver 接口
    • 提供固定的主题解析策略
  • 核心功能点
    • 固定主题返回 - resolveThemeName() 方法总是返回同一个预设的主题名称
    • 不支持动态更改 - setThemeName() 方法抛出 UnsupportedOperationException,因为主题是固定的无法更改

初始化处理器映射器(路由映射):initHandlerMappings()

在这里插入图片描述

  • 组件主要作用:负责建立 HTTP 请求与处理器(Handler)之间的映射关系。它的核心作用可概括为:根据请求信息(URL、请求方法、请求头等)找到对应的处理器(Controller 方法)
  • 默认实现org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
  • 常用实现RequestMappingHandlerMapping
    • 继承自 RequestMappingInfoHandlerMapping
    • 实现了 MatchableHandlerMappingEmbeddedValueResolverAware 接口
    • Spring MVC 3.1 版本引入,是基于注解的请求映射核心组件
  • 核心初始化源码
  1. 请求映射创建 - 从带有 @RequestMapping 注解的控制器类和方法创建 RequestMappingInfo 实例
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. 处理器检测 - 通过 isHandler() 方法识别带有 @Controller@RequestMapping 注解的类
    在这里插入图片描述

初始化处理器适配器(调用 Controller):initHandlerAdapters()

在这里插入图片描述

  • 组件主要作用HandlerAdapter 是连接 DispatcherServlet 与具体处理器(Handler)的关键组件,负责实际调用处理器方法并处理返回值。Spring MVC 提供了多种默认实现,支持不同类型的处理器。
  • 默认实现org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
  • 常用实现RequestMappingHandlerAdapter
    • 继承自 AbstractHandlerMethodAdapter
    • 实现了 BeanFactoryAwareInitializingBean 接口
    • Spring MVC 3.1 版本引入,是基于注解的请求处理核心组件
  • 核心初始化源码
    在这里插入图片描述
    在这里插入图片描述

初始化异常解析器:initHandlerExceptionResolvers

在这里插入图片描述

  • 组件主要作用HandlerExceptionResolver 是处理控制器执行过程中抛出异常的核心组件。Spring 提供了多个默认实现,共同构成了异常处理的完整体系。
  • 核心初始化源码
    在这里插入图片描述
    在这里插入图片描述

初始化视图名转换器:initRequestToViewNameTranslator()

在这里插入图片描述

  • 组件主要作用RequestToViewNameTranslator 是一个关键的视图解析辅助组件,它负责在控制器方法没有显式返回视图名称时,自动根据请求信息推导出默认的视图名称
  • 默认实现类org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

初始化视图解析器(渲染视图):initViewResolvers()

在这里插入图片描述

  • 组件主要作用ViewResolver 是 Spring MVC 的关键组件,负责将控制器返回的逻辑视图名称解析为实际的视图对象(View),以便后续渲染为最终输出(如HTML页面或JSON响应)‌
  • 默认实现类org.springframework.web.servlet.view.InternalResourceViewResolver
  • 核心初始化源码
    在这里插入图片描述

初始化Flash 属性管理器:initFlashMapManager()

在这里插入图片描述

  • 组件主要作用FlashMapManager 是 Spring MVC 中用于在重定向场景下跨请求传递临时参数的核心组件,其默认实现基于 Session 存储,确保参数在重定向后自动传递且无需暴露在 URL 中。
  • 默认实现类org.springframework.web.servlet.support.SessionFlashMapManager

2. DispatcherServlet - 前端控制器(请求处理中枢)

源码路径org.springframework.web.servlet.DispatcherServlet
核心方法doDispatch()
一次HTTP请求过程

  • DispatcherServlet#doGet()/doPost()/..[FrameworkServlett#doGet()/doPost()/..]
  • –>FrameworkServlet#processRequest()
  • –>FrameworkServlet#doService()[DispatcherServlet#doService()]
  • –>DispatcherServlet#doDispatch()
请求源码入口:FrameworkServlet#doGet()

在这里插入图片描述
在这里插入图片描述

请求委托分发:DispatcherServlet#doService()

在这里插入图片描述

核心请求处理:DispatcherServlet#doDispatch()

在这里插入图片描述

3. HandlerMapping - 请求映射处理器(请求路由引擎)

以常用的 HandlerMapping 实现类 RequestMappingHandlerMapping 进行分析。
源码路径org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
源码解析

DispatcherServlet.getHandler()

在这里插入图片描述
AbstractHandlerMapping.getHandler()

在这里插入图片描述

AbstractHandlerMethodMapping.getHandlerInternal()

在这里插入图片描述

AbstractHandlerMethodMapping.lookupHandlerMethod()

在这里插入图片描述

AbstractHandlerMethodMapping.addMatchingMappings()

在这里插入图片描述

RequestMappingInfoHandlerMapping.getMatchingMapping()

在这里插入图片描述

这里最终调用的是RequestMappingInfo#getMatchingCondition()方法, 貌似看跟 RequestMappingHandlerMapping 没啥关系,但是玄机就在于RequestMappingInfo这个对象的来源:

  • 它负责创建和配置 RequestMappingInfo 对象
  • 它提供匹配所需的上下文配置(如是否支持后缀匹配等)
  • 它决定了哪些类和方法应该被当作处理器处理(通过 isHandler() 方法)
  • 它提供了创建映射信息的逻辑(通过 getMappingForMethod() 方法)

所以虽然直接调用的是 RequestMappingInfo 的方法,但 RequestMappingHandlerMapping 提供了匹配所需的配置和上下文,是整个机制不可缺少的一部分。

最后:这里最终会获得一个HandlerMapping 对象,加之基于请求path配置的所有匹配的一个或多个HandlerInterceptor对象一起包装为HandlerExecutionChain对象并返回。

4. HandlerAdapter - 处理器适配器

以常用的 HandlerAdapter 实现类 RequestMappingHandlerAdapter 进行分析。
源码路径org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
核心方法handleInternal()
源码解析

在这里插入图片描述

AbstractHandlerMethodAdapter.supports()

在这里插入图片描述

RequestMappingHandlerAdapter.supportsInternal()

在这里插入图片描述
核心要点:最终这里会返回一个可以使用的HandlerAdapter,即RequestMappingHandlerAdapter;关于RequestMappingHandlerAdapter.supportsInternal()总是返回true这里在阐述下:

  • 专用适配器RequestMappingHandlerAdapter 是专门为处理带有 @RequestMapping 注解的处理器方法而设计的,所以它支持所有 HandlerMethod 实例。
  • 前期筛选:在请求处理流程中,已经通过 RequestMappingHandlerMapping 确保了只有带有 @RequestMapping 注解的方法才会被路由到这个适配器。
  • 灵活性:通过返回 true,该适配器可以处理所有通过 RequestMappingHandlerMapping 映射的处理器方法,无需额外的运行时检查。

这个方法的设计体现了Spring MVC的职责分离原则RequestMappingHandlerMapping 负责确定哪些方法可以处理请求,而 RequestMappingHandlerAdapter 负责实际执行这些方法。由于这两个组件是成对工作的,所以适配器可以安全地接受所有由映射器提供的处理器方法

在找到合适的HandlerAdapter之后会先执行HandlerExecutionChain的前置拦截器处理逻辑,源码如下:

HandlerExecutionChain.applyPreHandle()

在这里插入图片描述

所有已注册匹配的拦截器链上的前置拦截逻辑正常执行完毕之后紧接着才实际调用处理器核心处理方法(HandlerAdapter.handle()),返回结果视图对象,源码如下:

AbstractHandlerMethodAdapter.handle()

在这里插入图片描述

RequestMappingHandlerAdapter.handleInternal()

在这里插入图片描述

RequestMappingHandlerAdapter.invokeHandlerMethod()

在这里插入图片描述

ServletInvocableHandlerMethod.invokeAndHandle()

在这里插入图片描述
核心要点:这里最后执行 invokeAndHandle() 方法是Spring MVC执行控制器方法和处理返回值的关键环节,它通过策略模式使用不同的返回值处理器来处理各种类型的返回值,实现了高度灵活的返回值处理机制。

RequestMappingHandlerAdapter.getModelAndView()

在这里插入图片描述

核心要点:至此,执行完了 HandlerMethod(处理 HTTP 请求),最后并返回 ModelAndView对象(如果是通过 @ResponseBody 直接写入响应,则返回null)。

5. HandlerMethodArgumentResolver - 参数解析器

以常用的 HandlerMethodArgumentResolver 实现类 RequestResponseBodyMethodProcessor 进行分析。
源码路径org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor
核心方法resolveArgument()
源码解析

在这里插入图片描述

InvocableHandlerMethod.getMethodArgumentValues()

在这里插入图片描述

HandlerMethodArgumentResolverComposite.supportsParameter()

在这里插入图片描述

HandlerMethodArgumentResolverComposite.getArgumentResolver()

在这里插入图片描述

RequestResponseBodyMethodProcessor.supportsParameter()

在这里插入图片描述

HandlerMethodArgumentResolverComposite.resolveArgument()

在这里插入图片描述

RequestResponseBodyMethodProcessor.resolveArgument()

在这里插入图片描述
核心要点getMethodArgumentValues() 方法通过策略模式组合模式,实现了灵活的参数解析机制,使得Spring MVC能够处理各种类型的控制器方法参数,这是Spring MVC参数绑定功能的核心实现。
常见的参数解析器:

  • @PathVariable -> PathVariableMethodArgumentResolver
  • @RequestParam -> RequestParamMethodArgumentResolver
  • @RequestBody -> RequestResponseBodyMethodProcessor
  • @RequestHeader -> RequestHeaderMethodArgumentResolver

6. HandlerMethodReturnValueHandler - 返回值处理器

以常用的 HandlerMethodReturnValueHandler 实现类 RequestResponseBodyMethodProcessor 进行分析。
源码路径org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor
核心方法handleReturnValue()
源码解析

在这里插入图片描述

HandlerMethodReturnValueHandlerComposite.selectHandler()

在这里插入图片描述

RequestResponseBodyMethodProcessor.supportsReturnType()

在这里插入图片描述

RequestResponseBodyMethodProcessor.handleReturnValue()

在这里插入图片描述

核心要点handleReturnValue() 方法是实现RESTful API的关键组件,它使Spring MVC能够直接将Java对象序列化为HTTP响应体,支持多种数据格式(JSON、XML等),是现代Web开发中处理API响应的核心机制。

7. RequestToViewNameTranslator - 视图名转换器

以常用的 RequestToViewNameTranslator 实现类 DefaultRequestToViewNameTranslator 进行分析。
源码路径org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
核心方法getViewName()
源码解析

在这里插入图片描述

DispatcherServlet.getDefaultViewName()

在这里插入图片描述

DefaultRequestToViewNameTranslator.getViewName()

在这里插入图片描述

核心要点getViewName() 是 DefaultRequestToViewNameTranslator 类的核心方法,,该方法提供了一种约定优于配置的方式,根据HTTP请求URL自动生成合适的视图名称。

方法执行到这里其主要的逻辑已经执行完毕了, 有了完整的返回结果, 这时会执行拦截器的后置处理方法applyPreHandle()), 拦截器来源于前面匹配的 HandlerExecutionChain ,其源码如下:

HandlerExecutionChain.applyPostHandle()

在这里插入图片描述

接下就是最终环节了, 处理结果(渲染视图/处理异常)等, 接着往下看源码:

DispatcherServlet.processDispatchResult()

在这里插入图片描述

8. HandlerExceptionResolvers - 异常解析器

以常用的 HandlerExceptionResolvers 实现类 ExceptionHandlerExceptionResolver 进行分析。
源码路径org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver
核心方法doResolveHandlerMethodException()
源码解析

在这里插入图片描述

HandlerExceptionResolverComposite.resolveException()

在这里插入图片描述

AbstractHandlerExceptionResolver.resolveException()
在这里插入图片描述

AbstractHandlerMethodExceptionResolver.doResolveException()

在这里插入图片描述

ExceptionHandlerExceptionResolver.doResolveHandlerMethodException()

在这里插入图片描述

核心要点:这里正常情况下我们通过 ExceptionHandlerExceptionResolverdoResolveHandlerMethodException()方法找到对应的异常处理方法(标注@ExceptionHandler)进行了异常的处理,所有实际会返回一个空的ModelAndView,外层判断空的 ModelAndView是直接返回 null,表示异常已经处理完毕,不需要再进行后续处理。

9. ViewResolver - 视图解析器(渲染视图)

以常用的 ViewResolver 实现类 InternalResourceViewResolver 进行分析。
源码路径org.springframework.web.servlet.view.InternalResourceViewResolver
核心方法resolveViewName()
源码解析

在这里插入图片描述

DispatcherServlet.resolveViewName()
在这里插入图片描述

ViewResolverComposite.resolveViewName()

在这里插入图片描述

AbstractCachingViewResolver.resolveViewName()
在这里插入图片描述

AbstractCachingViewResolver.createView()

在这里插入图片描述

UrlBasedViewResolver.loadView()

在这里插入图片描述

InternalResourceViewResolver.buildView()

在这里插入图片描述

UrlBasedViewResolver.buildView()

在这里插入图片描述
核心要点:由源码可知完整的实现链是:AbstractCachingViewResolver 定义了缓存机制和模板方法;UrlBasedViewResolver 实现了 loadView 并提供了 buildView 模板方法;InternalResourceViewResolver 重写了 buildView 方法以添加 InternalResourceView 特定的配置;
这种设计充分利用了模板方法模式,使得每一层都只关注自己的职责。
其实到这里已经创建了一个完整的 View 对象了, 接下来还需要调用 View 对象的 render() 方法来渲染视图。
View.render() 是一个接口方法,不同的视图实现类会有不同的实现。以最常见的 InternalResourceView(用于 JSP 渲染)为例接着分析,源码如下:

AbstractView.render()

在这里插入图片描述

InternalResourceView.renderMergedOutputModel()

在这里插入图片描述

核心要点view.render() 这个方法是 Spring MVC 视图渲染的核心方法,也是视图渲染的终点,将处理结果转换为实际的 HTTP 响应内容。
常见的

10. LocaleResolver - 地区区域解析器(国际化i18n)

以常用的 LocaleResolver 实现类 AcceptHeaderLocaleResolver 进行分析。
源码路径org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
核心方法resolveLocale()
源码解析

AcceptHeaderLocaleResolver.resolveLocale()

在这里插入图片描述

核心要点LocaleResolver 的实现类提供了不同的区域设置解析策略,开发者可以根据应用需求选择合适的实现。调用链路从 DispatcherServlet 初始化开始,贯穿整个请求处理过程,最终在视图渲染时使用解析到的区域设置

三、请求处理全流程剖析

在这里插入图片描述

关键流程说明:

  1. 请求分发:DispatcherServlet 接收所有请求
  2. 处理器映射:通过 HandlerMapping 找到匹配的 Controller 方法
  3. 参数解析:HandlerAdapter 使用 ArgumentResolvers 解析方法参数
  4. 业务执行:调用 Controller 业务逻辑
  5. 返回值处理:使用 ReturnValueHandlers 处理返回值
  6. 视图解析:ViewResolver 将逻辑视图名解析为具体 View
  7. 视图渲染:View 对象渲染响应内容

四、核心设计模式应用

1. 策略模式(组件可插拔)

public interface HandlerMapping {HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}public interface HandlerAdapter {boolean supports(Object handler);ModelAndView handle(...) throws Exception;
}
  • 不同实现类处理不同类型的处理器
  • 可通过配置替换默认实现
  • 运行时动态选择适配器

2. 模板方法模式(流程标准化)

public abstract class AbstractHandlerMethodAdapter extends WebContentGenerator implements HandlerAdapter {public final ModelAndView handle(...) throws Exception {// 固定处理流程checkRequest(request);return handleInternal(request, response, handlerMethod);}// 子类实现具体逻辑protected abstract ModelAndView handleInternal(...) throws Exception;
}

3. 责任链模式(拦截器栈)

public class HandlerExecutionChain {private final List<HandlerInterceptor> interceptorList = new ArrayList<>();boolean applyPreHandle(...) {// 顺序执行拦截器前置处理for (HandlerInterceptor interceptor : interceptorList) {if (!interceptor.preHandle(request, response, this.handler)) {return false;}}return true;}
}

五、扩展机制实战

1. 自定义参数解析器

public class CustomArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.hasParameterAnnotation(CustomAnnotation.class);}@Overridepublic Object resolveArgument(...) {// 自定义参数解析逻辑return customValue;}
}// 注册到Spring容器
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(new CustomArgumentResolver());}
}

2. 自定义视图解析器

public class CustomViewResolver implements ViewResolver {@Overridepublic View resolveViewName(String viewName, Locale locale) throws Exception {if (viewName.startsWith("custom:")) {return new CustomView(); // 自定义视图实现}return null; // 交给其他解析器处理}
}

六、性能优化设计

1. 映射缓存机制

public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping {// 映射关系缓存private final MappingRegistry mappingRegistry = new MappingRegistry();class MappingRegistry {// URL到HandlerMethod的映射缓存private final Map<String, MappingRegistration<T>> registry = new HashMap<>();// 方法签名缓存private final Map<HandlerMethod, T> mappingLookup = new LinkedHashMap<>();}
}

2. 快速失败机制

public class DispatcherServlet extends FrameworkServlet {protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {try {// 处理流程...} catch (Exception ex) {// 快速捕获异常processDispatchResult(..., ex);}}
}

3. 性能优化方案

@Configuration
public class PerformanceConfig {// 限制上传文件大小@Beanpublic MultipartResolver multipartResolver() {CommonsMultipartResolver resolver = new CommonsMultipartResolver();resolver.setMaxUploadSize(1024 * 1024 * 10); // 10MBreturn resolver;}// 启用GZIP压缩@Beanpublic FilterRegistrationBean<GzipFilter> gzipFilter() {FilterRegistrationBean<GzipFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new GzipFilter());registration.addUrlPatterns("/*");return registration;}
}

七、Spring MVC 设计精髓总结

  • 组件化架构:9大核心组件各司其职;通过策略接口实现松耦合
  • 扩展点丰富:14+扩展接口覆盖请求处理全生命周期;支持自定义参数解析、返回值处理等
  • 分层处理:清晰的请求处理流水线
  • 性能优化:映射关系缓存 + 懒加载机制 + 快速失败处理
  • 与现代技术融合:无缝支持 RESTful、完美整合 WebSocket、兼容响应式编程模型
  • 设计模式典范:前端控制器模式统一入口 + 策略模式实现组件替换 + 模板方法模式固定流程

Spring MVC的优雅不仅在于功能强大,更在于其精心设计的扩展性可维护性。理解其底层架构,能让我们在复杂业务场景中游刃有余。


End!


扩展

MultipartResolver Diagram
在这里插入图片描述

LocaleResolver Diagram
在这里插入图片描述

ThemeResolver Diagram
在这里插入图片描述

HandlerMapping Diagram
在这里插入图片描述

HandlerAdapter Diagram
在这里插入图片描述

HandlerExceptionResolver Diagram
在这里插入图片描述

RequestToViewNameTranslator Diagram
在这里插入图片描述

ViewResolver Diagram
在这里插入图片描述

FlashMapManager Diagram
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90794.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90794.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90794.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s之控制器详解

1.deployment&#xff1a;适用于无状态服务1.功能(1)创建高可用pod&#xff08;2&#xff09;滚动升级/回滚&#xff08;3&#xff09;平滑扩容和缩容2.操作命令&#xff08;1&#xff09;回滚# 回滚到上一个版本 kubectl rollout undo deployment/my-app# 回滚到特定版本&…

.NET Core中的配置系统

传统配置方式文件Web.config 进行配置。ConfigurationManager类配置。.NET配置系统中支持配置方式文件配置&#xff08;json、xml、ini等&#xff09;注册表环境变量命令行自定义配置源Json文件配置方式实现步骤&#xff1a;创建一个json文件&#xff0c;把文件设置 为“如果较…

kafka的消费者负载均衡机制

Kafka 的消费者负载均衡机制是保证消息高效消费的核心设计&#xff0c;通过将分区合理分配给消费者组内的消费者&#xff0c;实现并行处理和负载均衡。以下从核心概念、分配策略、重平衡机制等方面详细讲解。一、核心概念理解消费者负载均衡前&#xff0c;需明确三个关键概念&a…

腾讯云edges on部署pages

腾讯云edges on部署pages适用场景部署方式官方文档 适用场景 Next.js Hexo 以及用React Vue等现代前端框架构建的单页应用全栈项目开发 通过Pages Function KV等能力 实现轻量化的动态服务快速部署与迭代 通过Github等代码管理平台集成 每次代码提交时自动构建和部署网站 注…

SpringAI入门及浅实践,实战 Spring‎ AI 调用大模型、提示词工程、对话记忆、Adv‎isor 的使用

上一次写AI学习笔记已经好久之前了&#xff0c;温习温习&#xff0c;这一章讲讲关于Spring‎ AI 调用大模型、对话记忆、Adv‎isor、结构化输出、自定义对话记忆‍、Prompt 模板的相关知识点。 快速跳转到你感兴趣的地方一、提示词工程&#xff08;Prompt&#xff09;1. 基本概…

对抗攻击-知识点

文章目录自然图像往往靠近机器学习分类器学习到的决策边界&#xff08;decision boundaries&#xff09;。正交方向--改变某一个不影响其它的特征降采样&#xff08;Feature Downsampling&#xff09;通过黑盒攻击的持续挑战&#xff0c;我们才能构建真正安全可靠的智能系统DCT…

7.26 作业

一、实验要求及其拓扑图&#xff1a; 本次实验拓扑图&#xff1a; 二、实验IP地址划分&#xff1a; 1. 公网地址&#xff08;R5 作为 ISP&#xff0c;使用公网地址&#xff09;&#xff1a; R1 与 R5 之间接口&#xff1a;15.1.1.0/24&#xff0c;R1 侧为 15.1.1…

Kafka运维实战 14 - kafka消费者组消费进度(Lag)深入理解【实战】

目录什么是消费者 Lag举例说明&#xff1a;Lag 的意义&#xff1a;Lag 监控和查询kafka-consumer-groups基本语法常用命令示例1. 查看单个消费者组的详细信息&#xff08;最常用&#xff09;2. 列出所有消费者组&#xff08;只显示名称&#xff09;3. 列出所有消费者组&#xf…

设计模式(十三)结构型:代理模式详解

设计模式&#xff08;十三&#xff09;结构型&#xff1a;代理模式详解代理模式&#xff08;Proxy Pattern&#xff09;是 GoF 23 种设计模式中的结构型模式之一&#xff0c;其核心价值在于为其他对象提供一种间接访问的机制&#xff0c;以控制对原始对象的访问。它通过引入一个…

24点数学游戏(穷举法求解表达式)

摘要本毕业设计旨在利用MATLAB技术实现一个24点数学游戏&#xff0c;采用穷举法求解所有可能的表达式组合。通过全排列数字、枚举运算符及括号位置&#xff0c;结合递归回溯算法&#xff0c;系统能够高效地搜索所有可能的运算路径&#xff0c;并验证结果是否为24。实验结果表明…

【web应用】如何进行前后端调试Debug? + 前端JavaScript调试Debug?

文章目录一、前后端&#xff1a;后端以Debug模式运行后端项目&#xff0c;打断点二、前后端&#xff1a;前端项目在浏览器中调试三、单独前端&#xff1a;前端JavaScript调试1、控制台输出2、网页调试器中添加断点3、debugger关键字一、前后端&#xff1a;后端以Debug模式运行后…

FreeCAD开发楼梯参数化三维模型和钢格栅

根据楼梯标准图集开发各种楼梯。上行左转&#xff0c;上行右转&#xff0c;对应的栏杆也是配套2种。楼梯总成钢格栅标准里的跨度和承载 扁钢尺寸&#xff0c;轻松切换和修改参数。格栅综合本来格栅上横杆是冷轧扭钢筋&#xff0c;先绘制一个圆柱&#xff0c;再做一个内切正方形…

【AcWing 836题解】合并集合

AcWing 836. 合并集合 【题目描述】 在查看解析之前&#xff0c;先给自己一点时间思考哦&#xff01; 【题解】 并查集是一种用于处理集合合并与查询问题的数据结构&#xff0c;通常支持以下两种操作&#xff1a; Find&#xff1a;查询一个元素所在的集合。 Union&#xff1a…

MySQL锁机制与MVCC原理剖析

在MySQL中&#xff0c;我们使用到了它的各种类锁&#xff1b;按照它的维度&#xff0c;有各种锁 从数据库的操作粒度有&#xff0c;表锁&#xff0c;行锁。从数据库的操作的类型&#xff0c;有读锁和写锁。性能上有乐观锁和悲观锁。 在上一篇文章中的事务隔离级别&#xff0c;需…

C++学习(线程相关)

目录 一、线程库thread 1.使用外部函数 2. 使用类的函数 3. 添加参数 二、线程库 mutex 1.使用lock()方法 2.try_lock()方法 三、线程库lock_guard 四、线程库unique_lock 1.adopt_lock 2.defer_lock() 五、线程库call_once 六、线程库promise & future 七、c…

EPOLLONESHOT 深度解析:Linux epoll 的单次触发机制

EPOLLONESHOT 深度解析&#xff1a;Linux epoll 的单次触发机制 EPOLLONESHOT 是 Linux epoll 接口中的高级事件标志&#xff0c;用于实现精确的事件单次触发控制。以下是其全面技术解析&#xff1a; 核心设计理念 #mermaid-svg-Xg5sCLdddqmKsvKG {font-family:"trebuchet…

深入解析MongoDB分片原理与运维实践指南

深入解析MongoDB分片原理与运维实践指南 技术背景与应用场景 随着互联网业务的高速发展&#xff0c;单节点MongoDB实例在数据量和访问并发上都面临瓶颈。为了解决数据存储容量受限和读写性能下降的问题&#xff0c;MongoDB官方提供了分片&#xff08;Sharding&#xff09;方案&…

基于Django的天气数据可视化分析预测系统

【86-Django】基于Django的天气数据可视化分析预测系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介 二、项目界面展示 三、项目视频展示 四、技术架构 五、核心功能模块 六、部署教程一、项目简介 随着全球气候变化和极端天气事件的频发&am…

怎么放大单片机输出电流

单片机作为电子系统的控制核心&#xff0c;其 I/O 口输出电流通常较小&#xff08;一般在 10-20mA 左右&#xff09;&#xff0c;难以直接驱动继电器、电机、大功率 LED 等需要较大工作电流的外设。因此&#xff0c;在实际应用中需通过特定电路放大单片机输出电流&#xff0c;实…

站长百科类网站pbootcms模板(自适应手机端)+利于SEO优化(下载)

站长百科类网站pbootcms模板(自适应手机端)利于SEO优化 模板介绍&#xff1a; PbootCMS内核开发的模板&#xff0c;该模板属于新闻资讯、新闻博客类企业使用&#xff01; 页面简洁简单&#xff0c;容易管理&#xff0c;附带测试数据&#xff01; 模板特点&#xff1a; 1、手工书…