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 | "spring.servlet.multipart", ignoreUnknownFields = false) (prefix = |
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
方法调用。