【SpringBoot】SpringMVC自动配置

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类【SpringBoot】SpringMVC自动配置

所有WebMvcConfigurer 一起起作用

  1. 我们 实现WebMvcConfigurer 接口就可以扩展的原因
    WebMvcAutoConfigurationAdapter实现了WebMvcConfigurer接口,上面有一句注解:

    @Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
    

    EnableWebMvcConfiguration 继承了 DelegatingWebMvcConfiguration类
    【SpringBoot】SpringMVC自动配置

    DelegatingWebMvcConfiguration类的setConfigurers方法 从容器中获取所 有的WebMvcConfigurer
    然后把这些WebMvcConfigurer都赋值到configurers中,【SpringBoot】SpringMVC自动配置
    最后都是调用configurers的方法来实现功能
    【SpringBoot】SpringMVC自动配置
    例如 addViewControllers 方法:
    实际上是用configurers调的addViewControllers方法

        protected void addViewControllers(ViewControllerRegistry registry) {
            this.configurers.addViewControllers(registry);
        }
    

    在configurers调的addViewControllers方法如下:
    就是遍历所有的WebMvcConfigurer,调用每个WebMvcConfigurer的addViewControllers方法【SpringBoot】SpringMVC自动配置
    由于我们自己的类实现了WebMvcConfigurer,所以这里遍历的时候自然会有我们自己的方法

不能加@EnableWebMvc 原因

加了@EnableWebMvc SpringBoot对SpringMVC的自动配置就都失效了,这样就相当于我们全面接管了SpringMVC
2. 加@EnableWebMvc 注解自动配置失效的原因

EnableWebMvc导入了DelegatingWebMvcConfiguration,
而WebMvcAutoConfiguration上有一个@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})

因此容器中没有WebMvcConfigurationSupport时 SpringMVC自动配置才生效,EnableWebMvc导入的DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport,因此 自动配置不能生效
【SpringBoot】SpringMVC自动配置
【SpringBoot】SpringMVC自动配置
【SpringBoot】SpringMVC自动配置

上一篇:基于WeifenLuo.WinFormsUI.Docking界面布局控件的Winform框架


下一篇:SpringBoot中通过重写WebMvcConfigurer的方法配置静态资源映射实现图片上传后返回网络Url