Spring MVC DispatcherServlet 策略初始化 -- initMultipartResolver

本文所用源代码基于 Spring Web MVC 5.1.4.RELEASE

概述

DispatcherServlet#initMultipartResolver方法用于准备DispatcherServlet处理请求时所使用的MultipartResolver策略组件对象,也就是处理文件上传的策略组件对象。

#initMultipartResolver从容器(以及祖先容器)获取名称为multipartResolverbean组件对象,记录到属性DispatcherServlet实例成员属性multipartResolver。如果容器中名称为multipartResolverbean组件对象不存在,则属性multipartResolver保持为空,也就是说这种情况下不支持文件上传。

根据上面大致的介绍,我们可以看出:

  1. DispatcherServlet的属性multipartResolver会尝试记录容器中名称为multipartResolver类型为MultipartResolverbean组件用于处理文件上传数据。所以如果想定制DispatcherServlet所使用的MultipartResolver,开发人员可以注册相应的MultipartResolver的对象到容器;
  2. 如果容器中名称为multipartResolverbean组件对象不存在,则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");
			}
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值