小白第一次写,有问题请提出
事情是这样的,新建项目使用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类中配置的,所以没有保持了自动配置。
这里也就明白了为什么会自动配置失效。
我的理解是这样,如果有问题,欢迎指正。