1. 两种方式导致WebMvcConfigurationSupport失效
(1)自定义类并继承WebMvcConfigurationSupport
在Boot项目中,只要有类继承了WebMvcConfigurationSupport,那么Spring Boot提供的自动配置SpringMVC的该类(WebMvcConfigurationSupport)就会失效,也就是无法保持 mvc 的默认配置,相关配置需要自己实现,原因是在Mvc自动配置类WebMvcAutoConfiguration上有条件注解WebMvcConfigurationSupport.class
@ConditionalOnClass({Servlet.class,DispatcherServlet.class,WebMvcConfigurer.class)
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@ImportRuntimeHints({WebResourcesRuntimeHints.class})
public class WebMvcAutoConfiguration {
}
(2)@EnableWebMvc 禁用默认行为
@EnableWebMvc给容器中放入DelegatingWebMvcConfiguration组件:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({DelegatingWebMvcConfiguration.class})
public @interface EnableWebMvc {
}
而DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport { }
所以相当于容器中注入了WebMvcConfigurationSupport,符合情况一。
2、如何实现半自动化装配
给容器中写一个配置类@Configuration并
实现 WebMvcConfigurer
但是不要标注 @EnableWebMvc
注解,也不要继承WebMvcConfigurationSupport,即可以实现手自一体的效果
那么为什么实现WebMvcConfigurer就可以更改默认配置呢?
先来看一下WebMvcConfigurer接口中都有哪些方法:
该接口提供了配置SpringMvc底层的所有组件
首先因为WebMvcAutoConfigurationAdapter实现了该接口,
@Configuration(proxyBeanMethods = false)
@Import(EnableWebMvcConfiguration.class) //额外导入了其他配置
@EnableConfigurationProperties({ WebMvcProperties.class, WebProperties.class })
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware{
}
即向容器中放WebMvcConfigurer
组件;给SpringMVC添加各种定制功能所有的功能最终会和配置文件进行绑定,WebMvcProperties: spring.mvc
配置文件WebProperties: spring.web
配置文件。
之后,WebMvcAutoConfiguration中的第二个内部类EnableWebMvcConfiguration继承了DelegatingWebMvcConfiguration;而在DelegatingWebMvcConfiguration中声明了名为configurers,类型为WebMvcConfigurerComposite的属性,其set方法如下:
@Autowired(required = false)public void setConfigurers(List<WebMvcConfigurer> configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.configurers.addWebMvcConfigurers(configurers);}}
当EnableWebMvcConfiguration加载时,会将beanFactory中所有类型为WebMvcConfigurer的bean都传入该方法,同时包含WebMvcAutoConfigurationAdapter.这样自定义WebMvcConfigurer和默认的配置都可以生效,即实现了半自动化装配.