1.2 MVC 初始化
入口位于 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 bean。当然,默认是没有的。
地区解析器
LocaleResolver 接口定义了 Spring MVC 如何获取客户端(浏览器) 的地区,initLocaleResolver 方法在容器中寻找此 bean,如果没有,注册 AcceptHeaderLocaleResolver,即根据 request 的请求头 Accept-Language 获取地区。
spring-mvc 采用了属性文件的方式配置默认策略(即 bean),此文件位于 spring-mvc 的 jar 包的 org.springframework.web.servlet 下。
主题解析器
ThemeResolver 接口配合 Spring 标签库使用可以通过动态决定使用的 css 以及图片的方式达到换肤的效果,其类图:

如果容器中不存在叫做 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(视图)
其类图:

ViewResolver 检查
熟悉的套路,默认使用 InternalResourceViewResolver。
FlashMapManager
initFlashMapManager 方法会向容器注册 SessionFlashMapManager 对象,类图:

此接口和 FlashMap 搭配使用,用于在 请求重定向时保存/传递参数 。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论