Spring Boot中默认Mvc配置WebMvcConfigurationSupport失效原理

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和默认的配置都可以生效,即实现了半自动化装配.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值