本文所用源代码基于
Spring Web MVC 5.1.4.RELEASE
概述
DispatcherServlet#initMultipartResolver
方法用于准备DispatcherServlet
处理请求时所使用的MultipartResolver
策略组件对象,也就是处理文件上传的策略组件对象。
#initMultipartResolver
从容器(以及祖先容器)获取名称为multipartResolver
的bean
组件对象,记录到属性DispatcherServlet
实例成员属性multipartResolver
。如果容器中名称为multipartResolver
的bean
组件对象不存在,则属性multipartResolver
保持为空,也就是说这种情况下不支持文件上传。
根据上面大致的介绍,我们可以看出:
DispatcherServlet
的属性multipartResolver
会尝试记录容器中名称为multipartResolver
类型为MultipartResolver
的bean
组件用于处理文件上传数据。所以如果想定制DispatcherServlet
所使用的MultipartResolver
,开发人员可以注册相应的MultipartResolver的
对象到容器;- 如果容器中名称为
multipartResolver
的bean
组件对象不存在,则DispatcherServlet
的属性multipartResolver
为空,也就是说,此时无法处理文件上传。
到这里,你可能会有疑问,缺省情况下,开发人员并没有往容器中定义
MultipartResolver
组件,但实际上DispatcherServlet
能够从容器获得MultipartResolver
组件,这又是为什么呢?关于这一点,请参考 :
缺省情况下,
DispatcherServlet
所使用的MultipartResolver
是一个实现类StandardServletMultipartResolver
的实例。
源代码解析
方法 #initMultipartResolver
/**
* Initialize the MultipartResolver used by this class.
* If no bean is defined with the given name in the BeanFactory for this namespace,
* no multipart handling is provided.
*/
private void initMultipartResolver(ApplicationContext context) {
try {
// 从容器(以及祖先容器)获取名称为 multipartResolver 的 bean 组件对象,记录到属性 multipartResolver
this.multipartResolver = context.getBean(MULTIPART_RESOLVER_BEAN_NAME, MultipartResolver.class);
if (logger.isTraceEnabled()) {
logger.trace("Detected " + this.multipartResolver);
}
else if (logger.isDebugEnabled()) {
logger.debug("Detected " + this.multipartResolver.getClass().getSimpleName());
}
}
catch (NoSuchBeanDefinitionException ex) {
// Default is no multipart resolver.
// 如果容器中不存在名称为 multipartResolver 的 bean 组件,则保持属性 multipartResolver 为 null,
// 表示这种情况下不支持文件上传
this.multipartResolver = null;
if (logger.isTraceEnabled()) {
logger.trace("No MultipartResolver '" + MULTIPART_RESOLVER_BEAN_NAME + "' declared");
}
}
}