MultipartResolver
DispatcherServlet用于处理所有请求,doDispatch方法中会判断请求参数中是否包含文件。
| 1 | protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { | 
查看checkMultipart细节
| 1 | protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException { | 
首先我们了解下this.multipartResolver是如何被加载的
我们可以看到DispatcherServlet的方法中有初始化
| 1 | private void initMultipartResolver(ApplicationContext context) { | 
通过查看MultipartResolver的实现类,我们可以看到如下两个实现类
- CommonsMultipartResolver
- StandardServletMultipartResolver
其中StandardServletMultipartResolver在下述自动配置类中有被加载
| 1 | package org.springframework.boot.autoconfigure.web.servlet; | 
可以看出若没有指定MultipartResolver时,会默认加载StandardServletMultipartResolver。我们查看其isMultipart放过可知 当请求ContentType类型以multipart/则会认为是文件上传操作。
| 1 | 
 | 
解决上传文件大小限制
同时我们也可以得出,若没有指定的MultipartConfigElement时,会使用默认的this.multipartProperties.createMultipartConfig()
通过查看this.multipartProperties
| 1 | (prefix = "spring.servlet.multipart", ignoreUnknownFields = false) | 
MultipartProperties被自动EnableConfigurationProperties所引用
| 1 | 
 | 
则可通过修改对应SpringBoot可以配置application.yml
| 1 | spring: | 
EnableConfigurationProperties原理
通过查看注解EnableConfigurationProperties被调用处,即查找EnableConfigurationProperties.class出现处。我们可以看到在EnableConfigurationPropertiesImportSelector的方法
| 1 | private List<Class<?>> getTypes(AnnotationMetadata metadata) { | 
所有注解了EnableConfigurationProperties的类被自动注入到容器中了。
| 1 | 
 | 
| 1 | private void register(BeanDefinitionRegistry registry, ConfigurableListableBeanFactory beanFactory, | 
一步一步回溯可以最终可以看到被AbstractApplicationContext的refresh方法调用。
