SpringMVC自动配置
SpringBoot关于SpringMVC自动配置的文档: Spring MVC Auto-configuration
Spring MVC Auto-configuration
扩展Spring MVC
2.4.0官方文档关于扩展Spring MVC的说明:
If you want to keep those Spring Boot MVC customizations and make more MVC customizations (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc.
也就是我们可以编写一个配置类(@Configuration),是WebMvcConfigurer类型,并且不能标注 @EnableWebMvc。
这样就既保留了所有的自动配置,也能用我们扩展的配置:
我们想添加SpringMVC的什么功能就实现对应的方法
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//浏览器发送 /atguigu请求 来到success页面
registry.addViewController("/atguigu").setViewName("success");
}
}
原理
在WebMvcAutoConfiguration类
所有WebMvcConfigurer 一起起作用
-
我们 实现WebMvcConfigurer 接口就可以扩展的原因
WebMvcAutoConfigurationAdapter实现了WebMvcConfigurer接口,上面有一句注解:@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
EnableWebMvcConfiguration 继承了 DelegatingWebMvcConfiguration类
DelegatingWebMvcConfiguration类的setConfigurers方法 从容器中获取所 有的WebMvcConfigurer
然后把这些WebMvcConfigurer都赋值到configurers中,
最后都是调用configurers的方法来实现功能
例如 addViewControllers 方法:
实际上是用configurers调的addViewControllers方法protected void addViewControllers(ViewControllerRegistry registry) { this.configurers.addViewControllers(registry); }
在configurers调的addViewControllers方法如下:
就是遍历所有的WebMvcConfigurer,调用每个WebMvcConfigurer的addViewControllers方法
由于我们自己的类实现了WebMvcConfigurer,所以这里遍历的时候自然会有我们自己的方法
不能加@EnableWebMvc 原因
加了@EnableWebMvc SpringBoot对SpringMVC的自动配置就都失效了,这样就相当于我们全面接管了SpringMVC
2. 加@EnableWebMvc 注解自动配置失效的原因
EnableWebMvc导入了DelegatingWebMvcConfiguration,
而WebMvcAutoConfiguration上有一个@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
因此容器中没有WebMvcConfigurationSupport时 SpringMVC自动配置才生效,EnableWebMvc导入的DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport,因此 自动配置不能生效