关于自动配置WebMvcConfigurationSupport的一些问题

小白第一次写,有问题请提出

事情是这样的,新建项目使用WebMvcConfigurerAdapter扩展发现过时了,就去百度了一下,然后就看到了别人的博客使用WebMvcConfigurationSupport。然后意外就发生了。我竟然访问不了http://localhost:8080/。这可是把我折腾懵了。
然后去看了一下源码。
先找到自动配置类
在这里插入图片描述
我们看一下配置了什么
在这里插入图片描述这里发现有个条件@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
不能有这个Bean,这个bean不就是我们所用来配置springmvc扩展的类吗。那问题就有点眉目了,我们看一下自己写的配置代码。如下
在这里插入图片描述
在这里插入图片描述
发现了什么没有,对啊,我们把WebMvcConfigurationSupport加进了容器,所以WebMvcAutoConfiguration自动配置的条件不符合就不会去执行自动配置了。所以我们去访问http://localhost:8080/的时候是不会跳转到我们默认的资源文件下的index.html文件的。
那么问题来了,为什么继承WebMvcConfigurationSupport就不能自动配置了,我们在深入了解一下。
在这里插入图片描述
这里在WebMvcConfiguration中往下就是之前使用的WebMvcAutoConfigurationAdapter类现在已经过期,可以看到WebMvcAutoConfigurationAdapter实现了WebMvcConfigurer接口。所以可以知道WebMvcConfigurer拥有我们需要的扩展接口。
在这里插入图片描述
回到WebMvcAutoConfigurationAdapter
在这里插入图片描述
可以看到导入了EnableWebMvcConfiguration类,那么这个类做了什么?
继续往下看
在这里插入图片描述
里面有beanfactory(容器)还有资源文件配置mvc配置,在看一下他的父类。
在这里插入图片描述
可以看到setConfigures从容器中获取所有的WebMvcConfigurer
这时候也看到了他的父类。熟悉的WebMvcConfigurationSupport,原来在这里。
所以可以知道我们的EnableWebMvcConfiguration其实帮我们把基本的配置导入了。
那么看一下
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
点进去查看一下
在这里插入图片描述
可以看到是实现了WebMvcConfigurer,找到我们需要的addViewControllers

在这里插入图片描述
这里将所有的WebMvcConfigurer相关配置都来一起调用;也就是将this.configurers的所有配置都交由WebMvcConfigurerComposite 的个个接口去实现。如图所示的遍历循环然后加入delegate的对应方法中。

来看下WebMvcConfigurer
在这里插入图片描述
看一下描述
在这里插入图片描述
就是定义了我们可以自定义的配置的一些方法。
这里抽取部分我们常用的。

 /* 拦截器配置 */
void addInterceptors(InterceptorRegistry var1);
/* 视图跳转控制器 */
void addViewControllers(ViewControllerRegistry registry);
/**
     *静态资源处理
**/
void addResourceHandlers(ResourceHandlerRegistry registry);
/* 默认静态资源处理器 */
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
/**
     * 这里配置视图解析器
 **/
void configureViewResolvers(ViewResolverRegistry registry);
/* 配置内容裁决的一些选项*/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 解决跨域问题 **/
public void addCorsMappings(CorsRegistry registry) ;

我们点一下左边的接口实现,可以看到
在这里插入图片描述
这个是我自己写的一个配置类,可以看到实现了接口,后面就会出现在容器的配置中。
在这里插入图片描述
所以实现这个接口之后我们可以配置自己的自定义配置。而使用
WebMvcConfigurationSupport会使得自动配置失效。
回到EnableWebMvcConfiguration类中上面有一行注释
在这里插入图片描述
在这里插入图片描述那么@EnableWebMvc又是什么
双击Shift搜索一下EnableWebMvc
在这里插入图片描述
可以看到导入了DelegatingWebMvcConfiguration,也就是说@EnableWebMvcConfiguration@EnableWebMvc都是继承了DelegatingWebMvcConfiguration的特性。DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport的特性。
然后在官方文档中有说明使用@EnableWebMvc会造成自动配置失效,@EnableWebMvcConfiguration是在WebMvcAutoConfiguration中的WebMvcAutoConfigurationAdapter类中配置的,所以没有保持了自动配置。
这里也就明白了为什么会自动配置失效。

我的理解是这样,如果有问题,欢迎指正。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值