专业的编程技术博客社区

网站首页 > 博客文章 正文

SpringMVC源码解析(5):策略对象初始化

baijin 2024-08-20 10:14:47 博客文章 9 ℃ 0 评论

前文《SpringMVC源码解析(4):DispatcherServlet上下文初始化 》介绍了:DispatcherServlet在初始化上下文过程中会调用OnFresh()方法强制刷新上下文。DispatcherServlet重写了该方法,其中只调用了一个initStrategies()方法。这个方法的作用是初始化SpringMVC框架所需的各种组件。

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

这些组件的初始化过程基本雷同,首先查看一下BeanFactory中是否已经定义了组件的Bean,如果没有的话则初始化为默认的接口实现。本文重点介绍一下初始化中涉及到的九大组件。

(1)MultipartResolver

MultipartResolver的作用主要是用来处理文件上传的。默认情况下,是没有multipart处理的。如果需要的话,可以在配置文件中添加。

(2)LocaleResolver

LocaleResolver的作用是Spring国际化参数配置。Spring配置国际化有三种方式:基于URL的参数配置、基于session的配置和基于Cookie的国际化配置。

(3)ThemeResolver

ThemeResolver 负责配置Web页主题,从而控制网页风格。ThemeResolver 是主题解析器的接口,主要有三个常用实现类:

  • FixedThemeResolver默认的主题解析器,选择固定的主题Theme;
  • CookieThemeResolver 是从客户端cookie中获取主题Theme
  • SessionThemeResolver 是从session中获取主题Theme

(4)HandlerMappings

客户端发出Request时,DispatcherServlet 会将Request提交给HandlerMappings,根据Web Application Context 的配置找到对应的Controller。

(5)HandlerAdapters

DispatcherServlet通过HandlerMappings得到处理器以后,会轮询HandlerAdapters模块,查找能够处理当前请求的处理器适配器的实现,包括:

  • HTTPRequestHandlerAdapter 是HTTP请求处理器的适配,最终调用HttpRequestHandler的handleRequest方法。
  • SimpleControllerHandlerAdapter 是将HTTP请求适配到一个控制器的实现进行处理。
  • AnnotationMethodHandlerAdapter 本是用来适配@RequestMapping注解的处理器,不过在Spring3.1以后已被弃用,已被RequestMappingHandlerAdapter取代。

(6)HandlerExceptionResolvers

HandlerExceptionResolver是Spring MVC提供的一个通用异常处理工具,不过需要注意的是,它只能处理请求过程中抛出的异常。

(7)RequestToViewNameTranslator

这个接口的作用是从请求对象中获取 viewName

public interface RequestToViewNameTranslator {  
        String getViewName(HttpServletRequest request) throws Exception;  
}

(8)ViewResolvers

DispatcherServlet会根据ModelAndView选择合适的视图进行渲染,选择合适的视图就是ViewResolvers的工作。

DispatcherServlet 将配置的 ViewResolver 信息都存放在 viewResolvers 中。ViewResolvers中定义了resolverViewName()方法,根据viewName创建合适类型的View实现。

render() 方法中会调用 resolverViewName() 方法,在这个方法中逐一调用ViewResolver去取得View对象。

(9)FlashMapManager

FlashMapManager和FlashMap提供了存储请求数据的能力,在使用重定向时非常必要。在重定向之前暂存请求数据,以便重定向之后还能使用。

FlashMapManager接口的retrieveAndUpdate() 可以从Session中获取FlashMap对象。

以上就是DispatcherServlet初始化的过程,接下来我们要看一下DispatcherServlet处理请求过程的源码。

我会持续更新关于物联网、云原生、数字化技术方面的文章,用简单的语言描述复杂的技术,也会偶尔发表一下对IT产业的看法,请大家多多关注,欢迎留言和转发,希望与大家互动交流,谢谢。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表