SpringBoot学习篇|配置拓展Webmvc
拓展WebMVC
Spring MVC Auto-configuration
有关内容原文见官方文档
简单来说就是能够通过Auto-configuration实现我们之前分析见到的全部功能,例如静态资源加载
ContentNegotiatingViewResolver
andBeanNameViewResolver
beans是视图解析器- 包括WebJars 在内的静态资源加载
- 自动注册类型转换器(可以自动封装转换对象)
- 支持一些消息格式的转换
- 可以自定义一些错误消息分析器
- 支持首页映射
- 支持图标自定义
- 支持web初始化绑定
如果想要在上面配置的基础上进行拓展添加一些组件MVC configuration (interceptors, formatters, view controllers, and other features),那么我们只需要自己写一个配置类即可,这个配置类进行以下配置:
- 在Config包新建一个类(只是一般习惯,不是强制要求)
@Configuration
注释,标注这是一个配置类- 实现
WebMvcConfigurer
接口,让当前类作为实现类
然后我们就可以在类里面通过@Override
重写WebMvcConfigurer
接口的方法,然后就可以通过重写方法添加我们的功能组件(例如添加视图解析器),下面是一个通过重写WebMvcConfigurer
接口的addViewControllers
方法就可以添加一个视图跳转
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//添加一个视图跳转功能
@override
public void addViewControllers (ViewControllerRegistry registry) {
//浏览器发送/kuang,就会跳转到success页面;
registry.addViewController(" /h0cksr" ).setViewName( "success") ;
}
}
众多的自动配置原理都是一样的,通过这个WebMVC的自动配置
SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(如果用户自己配置@bean),如果有就用用户配置的,如果没有就用自动配置的;如果有些组件可以存在多个,比如我们的视图解析器,就将用户配置的和自己默认的组合起来!
WebMVC全盘接管
上面需要注意的是我们不能让我们的配置类带@EnableWebMvc
注释,不然的话这个类就不是MVC视图的配置拓展,而是MVC视图的配置接管了,首先我们要明白一点,这里的接管指的是接管自动导入全部默认配置的WebMvcAutoConfiguration
类,因为添加了这个注释之后WebMvcAutoConfiguration
机会因为不满足@ConditionalOnMissingBean
注解而全盘崩溃从而被接管,接管它的类就是@ConditionalOnMissingBean
判断的类WebMvcConfigurationSupport
,这个类是一个接口,在@EnableWebMvc
注释中导入的DelegatingWebMvcConfiguration
类就是接口的实现类,下面跟进源码分析一下:
- 先看一下自动导入配置的
WebMvcAutoConfiguration
@ConditionalOnxxx
注解表示的是判断条件,ConditionalOnMissingBean
表示只有参数中的类不存在时才生效,而@EnableWebMvc
注释就实现了这个判断类, - 下面进入
@EnableWebMvc
查看,可以看到添加了@EnableWebMvc
注释之后主要就是导入一个类 - 跟进看到
DelegatingWebMvcConfiguration
实现了WebMvcConfigurationSupport
接口 - 因为接口实现所以
WebMvcAutoConfiguration
被接管