SpringBoot中对mvc配置主要使用到WebMvcAutoConfiguration
:
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
...
}
- Configuration: WebMvcAutoConfiguration 是一个配置类
- ConditionalOnWebApplication:必须是web环境
- ConditionalOnClass:类路径存在
Servlet
,DispatcherServlet
,WebMvcConfigurer
- ConditionalOnMissingBean:不存在bean
WebMvcConfigurationSupport
- AutoConfigureAfter:在
DispatcherServletAutoConfiguration
,TaskExecutionAutoConfiguration
,ValidationAutoConfiguration
配置后配置
这里注意下第4点,第4点要求不存在bean
WebMvcConfigurationSupport
,所以当你使用了注解@EnableWebMvc
时,Spring会使用DelegatingWebMvcConfiguration
配置mvc,而不是WebMvcAutoConfiguration
。
WebMvcAutoConfiguration
有五个静态内部类,写成内部类的原因是当WebMvcAutoConfiguration
没有被启用时,内部类也不会被加载。
五个内部类:
WebMvcAutoConfigurationAdapter
EnableWebMvcConfiguration
ResourceChainCustomizerConfiguration
ResourceChainResourceHandlerRegistrationCustomizer
OptionalPathExtensionContentNegotiationStrategy
最重要是WebMvcAutoConfigurationAdapter
,EnableWebMvcConfiguration
。
1. WebMvcAutoConfigurationAdapter
类图:
WebMvcAutoConfigurationAdapter.png可以看到WebMvcAutoConfigurationAdapter
是WebMvcConfigurer
的一个实现,所以WebMvcAutoConfigurationAdapter
的配置会被WebMvcConfigurationSupport
加载,就像Spring-mvc配置中提到的。也就是一些默认的mvc配置,例如欢迎页,转换器,视图解析器。
除此之外,WebMvcAutoConfigurationAdapter
还有一个@Import(EnableWebMvcConfiguration.class)
。说明在加载 WebMvcAutoConfigurationAdapter
配之前需要加载EnableWebMvcConfiguration
。这也是一个自动配种非常重要的类。
2. EnableWebMvcConfiguration
Spring-boot官方文档对此配置类的说明:
Configuration equivalent to {@code @EnableWebMvc}.
相对应的翻译:
该配置类等价于使用注解`@EnableWebMvc`。
也就是说,当EnableWebMvcConfiguration
被加载时(使用Spring-boot配置项目时)我们不需要再使用注解@EnableWebMvc
。
类图:
035F7F09-8172-4a69-B701-C9E11170CAE2.png我们可以看到,它就是一个DelegatingWebMvcConfiguration
,这也解释了为什么当此类被加载时和@EnableWebMvc
是等价的。
2.1 作用
EnableWebMvcConfiguration
中主要是对父类的重写。
网友评论