1. MVC配置原理
途径:
1. 阅读源码
2. 官方文档
官方文档:https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#boot-features-spring-mvc-auto-configuration
1.1 分析MVC自动配置原理
看看如何自动配置的
找到我们熟悉的视图解析器,点击查看ViewResolver
发现是一个接口,该方法是用来解析视图的,我们看下它的实现类
发现它的有几个实现类,点击第三看看
getCandidateViews()方法是获取所有的候选视图,该方法里面是循环所有的视图解析器,然后通过视图解析器去获取所有视图并添加到视图候选区;
getBestView()是从候选区中获取最好的视图,最后返回最好的视图,接下来实现自定义视图解析器。
ContentNegotiatingViewResolver类是springboot自动装配的视图解析器,而且该类实现视图解析器的接口,所以关键是视图解析器的接口
2. 自定义MVC配置
如果您希望保留Spring Boot MVC功能,并且希望添加其他MVC配置(拦截器、格式化程序、视图控制器和其他功能),则可以添加自己的@configuration
类,类型为webmvcconfiguer
,但不添加@EnableWebMvc
。如果希望提供RequestMappingHandlerMapping
、RequestMappingHandlerAdapter
或ExceptionHandlerExceptionResolver
的自定义实例,则可以声明WebMVCregistrationAdapter
实例来提供此类组件。
2.1 自定义MVC配置
自定义的mvc类步骤:
1. 建立一个类配置@Configuration
2. 实现WebMvcConfigurer接口
3. 定义内部类实现ViewResolver接口,重写
我们自己定义一个MVC配置
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Bean //放到bean中
public ViewResolver myViewResolver(){
return new MyViewResolver();
}
public static class MyViewResolver implements ViewResolver{
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
//写我们需要的逻辑
return null;
}
}
}
2.3 测试MVC配置类
因为请求过程都会经过DispatcherServlet类中doDispatch方法
成功装配上!
3. SpringMVC扩展
SpringMVC自动配置
Spring Boot为Spring MVC提供了自动配置,它可以很好地与大多数应用程序一起工作。
自动配置在Spring默认设置的基础上添加了以下功能:
- 包含视图解析器
- 支持静态资源文件夹的路径,以及webjars
- 自动注册了Converter:转换器,这就是我们网页提交数据到后台自动封装成为对象的东西
- HttpMessageConverters,比如我们要把一个User对象转换为JSON字符串
- 定义错误代码生成规则的
- 首页定制
- 图标定制
- 初始化数据绑定器:帮我们把请求数据绑定到JavaBean中!
3.1 实现步骤
实现步骤:
- 建立配置类添加@Configuration
- 实现WebMvcConfigurer重现相应的方法;
我们先看实例
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//视图跳转
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//返回/abc会跳转到test.html
registry.addViewController("/abc").setViewName("test");
}
}
3.2 分析原理
我们可以去分析一下原理:
1、WebMvcAutoConfiguration 是 SpringMVC的自动配置类,里面有一个类WebMvcAutoConfigurationAdapter
2、这个类上有一个注解,在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)
3、我们点进EnableWebMvcConfiguration这个类看一下,它继承了一个父类:DelegatingWebMvcConfiguration
这个父类中有这样一段代码:
4、我们可以在这个类中去寻找一个我们刚才设置的viewController当做参考,发现它调用了一个
5、我们点进去看一下
4. 完全控制MVC配置
4.1 @EnableWebMvc
如果您想完全控制Spring MVC,可以添加自己的@Configuration,并用@EnableWebMvc进行注释。
用@EnableWebMvc注解,我们之前的配置的东西就会失效。比如定制首页失效。
4.2 分析原理
1.我们点击EnableWebMvc注解
2.我们点击DelegatingWebMvcConfiguration.class
DelegatingWebMvcConfiguration类看起来是不是很熟悉
继续WebMvcConfigurationSupport父类
3.
总结:
添加了@EnableWebMvc注解就相当于添加了WebMvcConfigurationSupport类,而mvc自动配置的类启动条件@ConditionalOnMissingBean中,是规定不能存在WebMvcConfigurationSupport类,存在则webMvc自动配置类失效。
内容参考:https://www.bilibili.com/video/BV1PE411i7CV
仅用于学习!