概述
自动配置类MultipartAutoConfiguration
针对Spring Servlet Web
应用环境,对文件上传进行相关配置。在配置参数spring.servlet.multipart.enaled
没有设置,或者设置为true
时,该自动配置类确保bean
MultipartConfigElement multipartConfigElement
或者bean
StandardServletMultipartResolver multipartResolver
的存在。也就是在这些bean
没有被定义的情况下定义这些bean
。
源代码
源代码版本 : spring-boot-autoconfigure-2.1.3.RELEASE
package org.springframework.boot.autoconfigure.web.servlet;
// 忽略 import 行
/**
* EnableAutoConfiguration Auto-configuration for multi-part uploads. Adds a
* StandardServletMultipartResolver if none is present, and adds a
* javax.servlet.MultipartConfigElement multipartConfigElement if none is
* otherwise defined. The ServletWebServerApplicationContext will associate the
* MultipartConfigElement bean to any Servlet beans.
*
* The javax.servlet.MultipartConfigElement is a Servlet API that's used to
* configure how the server handles file uploads.
*/
@Configuration
// 仅在指定类存在于 classpath 时才生效
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class,
MultipartConfigElement.class })
// 在配置参数 spring.servlet.multipart.enabled 没有被明确指定为 false 时生效
@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)
// 仅在当前应用是 Spring Servlet Web 应用时才生效
@ConditionalOnWebApplication(type = Type.SERVLET)
// 确保以为 spring.servlet.multipart 前缀的参数加载到 bean MultipartProperties
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {
private final MultipartProperties multipartProperties;
public MultipartAutoConfiguration(MultipartProperties multipartProperties) {
this.multipartProperties = multipartProperties;
}
// 定义 bean MultipartConfigElement
@Bean
// 仅在指定类型的 bean 不存在时才生效
@ConditionalOnMissingBean({ MultipartConfigElement.class,CommonsMultipartResolver.class })
public MultipartConfigElement multipartConfigElement() {
return this.multipartProperties.createMultipartConfig();
}
// 定义 bean StandardServletMultipartResolver, 名称为 multipartResolver
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
// 仅在该类型的 bean 不存在时才生效
@ConditionalOnMissingBean(MultipartResolver.class)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
return multipartResolver;
}
}