返回介绍

1.2 MVC 初始化

发布于 2025-10-03 18:08:53 字数 3646 浏览 0 评论 0 收藏

入口位于 DispatcherServlet 的 initStrategies 方法(经由 onRefresh 调用):

protected void initStrategies(ApplicationContext context) {
    initMultipartResolver(context);
    initLocaleResolver(context);
    initThemeResolver(context);
    initHandlerMappings(context);
    initHandlerAdapters(context);
    initHandlerExceptionResolvers(context);
    initRequestToViewNameTranslator(context);
    initViewResolvers(context);
    initFlashMapManager(context);
}

显然,这里就是 spring-mvc 的核心了。

文件上传支持

initMultipartResolver 核心源码:

private void initMultipartResolver(ApplicationContext context) {
    try {
        this.multipartResolver = context.getBean(MULTIPART_RESOLVER_BEAN_NAME, MultipartResolver.class);
    } catch (NoSuchBeanDefinitionException ex) {
        // Default is no multipart resolver.
        this.multipartResolver = null;
    }
}

MultipartResolver 用于开启 Spring MVC 文件上传功能,其类图:

MultipartResolver 类图

也就是说,如果我们要使用文件上传功能,须在容器中注册一个 MultipartResolver bean。当然,默认是没有的。

地区解析器

LocaleResolver 接口定义了 Spring MVC 如何获取客户端(浏览器) 的地区,initLocaleResolver 方法在容器中寻找此 bean,如果没有,注册 AcceptHeaderLocaleResolver,即根据 request 的请求头 Accept-Language 获取地区。

spring-mvc 采用了属性文件的方式配置默认策略(即 bean),此文件位于 spring-mvc 的 jar 包的 org.springframework.web.servlet 下。

主题解析器

ThemeResolver 接口配合 Spring 标签库使用可以通过动态决定使用的 css 以及图片的方式达到换肤的效果,其类图:

ThemeResolver 类图

如果容器中不存在叫做 themeResolver 的 bean,initThemeResolver 方法将向容器中注册 FixedThemeResolver,此 bean 只能提供一套默认的主题,名为 theme。

HandlerMapping 检查

initHandlerMappings 方法用于确保容器中 至少含有一个 HandlerMapping 对象 。从前面配置解析-注解驱动一节中可以看出,注解驱动导致已经注册了两个此对象。

如果没有开启注解驱动,那么将会使用默认的 HandlerMapping,相关源码:

if (this.handlerMappings == null) {
    this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
    if (logger.isDebugEnabled()) {
        logger.debug("No HandlerMappings found in servlet '" + getServletName() + "': using default");
    }
}

前面提到了,默认的策略由 DispatcherServlet.properties 决定, 目前是 BeanNameUrlHandlerMapping 和 DefaultAnnotationHandlerMapping

HandlerAdapter 检查

套路和上面完全一样,默认使用 HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter 和 AnnotationMethodHandlerAdapter。

HandlerExceptionResolver 检查

套路和上面完全一样,默认使用 AnnotationMethodHandlerExceptionResolver、ResponseStatusExceptionResolver、DefaultHandlerExceptionResolver。

RequestToViewNameTranslator

initRequestToViewNameTranslator 方法回向容器中注册一个 DefaultRequestToViewNameTranslator 对象,此接口用以完成从 HttpServletRequest 到视图名的解析,其使用场景是 给定的 URL 无法匹配任何控制器时

DefaultRequestToViewNameTranslator 的转换例子:

http://localhost:8080/gamecast/display.html -> display(视图)

其类图:

RequestToViewNameTranslator 类图

ViewResolver 检查

熟悉的套路,默认使用 InternalResourceViewResolver。

FlashMapManager

initFlashMapManager 方法会向容器注册 SessionFlashMapManager 对象,类图:

FlashMapManager 类图

此接口和 FlashMap 搭配使用,用于在 请求重定向时保存/传递参数

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。