web---静态资源配置原理
所有的原理配置都是从SpringBoot启动时开始自动配置的
首先,找到spring-boot-autoconfigure-2.6.1.jar下的\org\springframework\boot\autoconfigure\web\servlet【web自动配置场景的servlet自动配置的包】
在里面发现了如:DispatcherServletAutoConfiguration请求控制器自动配置类、HttpEncodingAutoConfiguration请求编码过滤器自动配置类、MultipartAutoConfiguration文件上传解析器自动配置类、ServletWebServerFactoryAutoConfiguration、 ServletWebServerFactoryConfiguration、【服务器自动配置类】 WebMvcAutoConfiguration【SpringMvc的自动配置类】本次要看的
WebMvcAutoConfiguration
在WebMvcAutoConfiguration类中
//说自己是一个配置类
@Configuration(proxyBeanMethods = false)
//这个工程要是一个servlet工程,符合要求
@ConditionalOnWebApplication(type = Type.SERVLET)
//工程里面有没有Servlet、DispatcherServlet、WebMvcConfigurer这几个类,引入了SpringBoot依赖就有
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
//工程里面不能有WebMvcConfigurationSupport,这个条件符合后面才学
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
//在DispatcherServletAutoConfiguration、TaskExecutionAutoConfiguration、ValidationAutoConfiguration这些类加载完后再进行加载
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {}
条件都符合,进入源码观察方法和内部类
首先就是一些默认视图前缀、后缀、请求转换器等工具,这些自动配置工具方法都用了配置@ConditionalOnMissingBean,如果用户配置了boot就不用配置了
springMvc自动配置适配器
然后再往下看
这是一个内部类,他是SpringMvc的自动配置适配器,里面只有一个有参构造,这说明在加载这个方法时参数都会从容器中获取
//说自己是一个配置类
@Configuration(proxyBeanMethods = false)
//引入了EnableWebMvcConfiguration这个组件
@Import(EnableWebMvcConfiguration.class)
//将WebMvcProperties、WebProperties这两个类注册为组件然后将开启配置绑定
@EnableConfigurationProperties({ WebMvcProperties.class, WebProperties.class })
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {
private static final Log logger = LogFactory.getLog(WebMvcConfigurer.class);
private final Resources resourceProperties;
private final WebMvcProperties mvcProperties;
private final ListableBeanFactory beanFactory;
private final ObjectProvider<HttpMessageConverters> messageConvertersProvider;
private final ObjectProvider<DispatcherServletPath> dispatcherServletPath;
private final ObjectProvider<ServletRegistrationBean<?>> servletRegistrations;
private final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
private ServletContext servletContext;
/*
WebProperties webProperties--->> 从容其中拿和前缀为spring.web配置绑定的属性
WebMvcProperties mvcProperties-->> 从容器拿和前缀spring.mvc配置绑定的属性
ListableBeanFactory beanFactory -->> 从容器中获取ListableBeanFactory
HttpMessageConverters--->>从容器中获取HttpMessageConverters
ResourceHandlerRegistrationCustomizer---从容器中获取ResourceHandlerRegistrationCustomizer资源处理器的自定义器
DispatcherServletPath--->>dispatcherservlet能处理的请求路径
ServletRegistrationBean---注册原生servlet、filter、listern用的
*/
public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties,
ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,
ObjectProvider<DispatcherServletPath> dispatcherServletPath,
ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
this.resourceProperties = webProperties.getResources();
this.mvcProperties = mvcProperties;
this.beanFactory = beanFactory;
this.messageConvertersProvider = messageConvertersProvider;
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
this.dispatcherServletPath = dispatcherServletPath;
this.servletRegistrations = servletRegistrations;
this.mvcProperties.checkConfiguration();
}
}