1、SpringBoot对SpringMVC自动配置
WebMvcAutoConfiguration:MVC自动配类
我们可以通过官方文档来看自动配置了什么东西
springboot:官方文档
图上springboot官方文档说明了对mvc自动装配的一些功能
1.1、ContentNegotiatingViewResolver分析
以装配ContentNegotiatingViewResolver视图解析器来说明
视图解析器:ViewResolver
先找大到WebMvcAutoConfiguration
自动配类
他里面有一个内部类WebMvcAutoConfigurationAdapter
在这个内部类中找到一个方法viewResolver
进入这个对象
找到一个resolveViewName
方法
这个方法的作用就是三步、获取所有的候选视图、在然后就是通过候选的视图得到一个最好的视图、将最好返回
看一下他是如何获取所有的候选视图的
打开这个方法、
可以看出他是从类的属性viewResolvers找到所有的视图
那么话又说回来了viewResolvers的值从哪来?
在他的ContentNegotiatingViewResolver类中的方法
图上说明了、在容器中获取所有的ViewResolver
将其添加到viewResolvers
类的属性中
最后可以得出一个小结、就是他会从容器中获取所有的视图解析器、并且选取后选的视图、那么我们要自己写一个视图解析器的话、要怎么办、解决方法就是写一个类实现ViewResolver
接口、将其类注入到容器中。
例子:
自己new了一个ViewResolver将其注入到容器中、
通过在DispatcherServlet
的doDispatch
方法打断点、可以看出我们自己创建的视图解析器也被加上了。
上面讲述只是将取了视图解析的自动配置、其余自动配置原理大致一样。
回到springboot官网
支持提供静态资源,包括对WebJars的支持(在本文档的后面部分中有介绍)。
/**
配置静态资源文件夹路径、WebJars的支持
**/
自动注册Converter,GenericConverter和Formatter。
/**
Converter:转换器(类型转换器)
Formatter:格式化器
**/
支持HttpMessageConverters
/**
HttpMessageConverters:消息转换器
**/
自动注册MessageCodesResolver
/**
MessageCodesResolver:定义错误代码生成规则
**/
静态index.html支持。
/**
在访问/请求的时候会找到templates中的index.html
**/
定制Favicon支持
/**
网页图标、在静态资源中设置一个名为Favicon.ico的图片
**/
自动使用ConfigurableWebBindingInitializerbean
/**
ConfigurableWebBindingInitializerbean:初始化web数据绑定器
**/
以上是springboot对mvc的自动配置
org.springframework.boot.autoconfigure.web:是对所有web场景所有的自动配置的jar包位置
小结一个点:
-
springboot在自动配置中、有一个细节
-
例子
@Bean @ConditionalOnMissingBean(HiddenHttpMethodFilter.class) @ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false) public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() { return new OrderedHiddenHttpMethodFilter(); }
@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
这个注解的意思就是容器中这个bean这个注册bean就失效。然后使用我们自己配置的bean、有的组件可以有多个、他会将用户配置的和默认的配置的一起使用将其组合起来
1.2、扩展SpringMVC
在springboot官网上也是说了、如果要定制、就是扩展、需要添加一个配置类、类型为 WebMvcConfigurer
的一个配置类且不能添加 @EnableWebMvc 注解
测试:
@Configuration
public class MyConfig implements WebMvcConfigurer {
//视图映射
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//浏览器访问http://localhost:8080/a 他会去通过视图解析找到对应的index.html页面
registry.addViewController("/a").setViewName("index");
}
}
这个只是扩展配置、不会将原有的配置替换掉、也就是说springboot帮我们配置的和我们自己配置的会一起生效。
原理:
- 可以从
WebMvcAutoConfiguration
配置类里面来看、它是、mvc的自动配置类
在WebMvcAutoConfigurationAdapter
类中、导入了一个类
进入这个类
他继承了一个类
进入这个类
可以看到他将容器中的所有WebMvcConfigurer
的类获取出来了然后将其放入WebMvcConfigurerComposite
类的addWebMvcConfigurers()方法中
addWebMvcConfigurers()方法
这个方法做的事情就是将其获取出来WebMvcConfigurer
放入WebMvcConfigurerComposite
类的delegates
属性中
最后会到这个WebMvcConfigurerComposite
类
随便找一个方法、点进configurePathMatch
方法、
会发现他会将所有的WebMvcConfigurer
遍历会将每一个WebMvcConfigurer
的configurePathMatch
方法调用一遍。
小结:
- springboot底层源码得出的结论就是、它会获取容器中所有的
WebMvcConfigurer
、并且调用每一个的WebMvcConfigurer
中实现的方法、 - 简单来说就是、springboot会调用SpringMVC自动配置类默认实现的方法、也会调用我们自己写的MVC扩展的实现方法。
- 最后的效果就是、springMVC的自动配置和我们自己写的扩展配置都会生效。
- 注意:
-
-
官网说的不能添加这个注解
@EnableWebMvc
-
1.3、全面接管SpringMVC
什么是全面接管、就是springboot帮我们配置的我们不需要的、所有都是我们自己配置
我们只需要在配置类加上一个注解@EnableWebMvc
@Configuration
@EnableWebMvc
public class MyConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
}
}
为什么加上这个注解SpringMVC的自动配置就是全部失效呢??
点进这个注解@EnableWebMvc
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2W4TFhkw-1598938687971)(E:\笔记\SpringBoot\SpringBoot_1\img\1598928687309.png)]
会发现就是将一个WebMvcConfigurationSupport
类注册到容器中了
WebMvcConfigurationSupport:是SpringMVC的基本功能。
回到springMVC自动配置类中、会发现上面有一个注解、
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
这个注解的意思就是、容器中没有这个组件时、这个自动配置类才生效
小结:
@EnableWebMvc
:作用就是让springboot对springmvc的自动配置失效、- 其实没必要全面接管、扩展SPringMVC就可以,