SpringBoot-MVC 自动配置原理
想要学到更多后端知识,欢迎关注【一心同学】
??????感谢各位大可爱小可爱!???????
1.问题引入
======
在我们之前学习的 SpringMVC 中,我们总是需要进行各种配置如:视图解析配置,注解扫描配置,但是自从我们用了 SpringBoot 之后,我们都不再需要进行这些配置了,轻松了许多,为什么呢?
回答:
这是因为 SpringBoot 为我们自动配置好了 SpringMVC。
2.SpringMVC 自动配置
===============
我们根据官方文档来看一下对 SpringMVC 自动配置了什么:
(1)包含视图解析器
(2)支持静态资源文件夹的路径,以及 webjars
(3)自动注册了 Converter:
转换器,这就是我们网页提交数据到后台自动封装成为对象的东西,比如把"1"字符串自动转换为 int 类型
HttpMessageConverters
SpringMVC用来转换Http请求和响应的的,比如我们要把一个User对象转换为JSON字符串,可以去看官网文档解释;
(4)定义错误代码生成规则的
(5)图标定制
(6)初始化数据绑定器:帮我们把请求数据绑定到 JavaBean 中!
官方提示:
(1)如果我们希望保留 Spring Boot MVC 功能,并且希望添加其他 MVC 配置(拦截器、格式化程序、视图控制器和其他功能),则可以添加自己的**@configuration 类,类型为 webmvcconfiguer,但不添加 @EnableWebMvc。**
(2)如果希望提供 RequestMappingHandlerMapping、RequestMappingHandlerAdapter 或 ExceptionHandlerExceptionResolver 的自定义实例,则可以声明 WebMVCregistrationAdapter 实例来提供此类组件。
(3)如果您想完全控制 Spring MVC,可以添加自己的 @Configuration,并用 @EnableWebMvc 进行注释。
3.原理分析
======
3.1 视图解析器
(1)我们进入 WebMvcAutoConfiguration 类,然后查看查看 ContentNegotiatingViewResolver 关键字,可以发现以下方法:
?
(2)进入 ContentNegotiatingViewResolver 类查看对应的视图解析方法:resolveViewName
?
(3)我们去查看一下 getCandidateViews 是怎么获得候选视图的。
?
**分析:**getCandidateViews 中看到它是把所有的视图解析器拿来,进行 while 循环,挨个解析
结论:ContentNegotiatingViewResolver 这个视图解析器就是用来组合所有的视图解析器的
(4)由上面可知 , 是遍历 ContentNegotiatingViewResolver 类中的 viewResolvers . 我们把目光聚焦在 viewResolvers,我们去研究下他的组合逻辑。
通过分析,发现 在 ContentNegotiatingViewResolver 中有一个初始化方法:
?
3.1.1 自定义视图解析器
既然它是在容器中去找视图解析器,我们只需要定制自己的 resolver,将自己的一个视图解析器添加到容器中即可,然后这个类就会帮我们自动的将它组合进来。
(1)在主启动类中写一个视图解析器
@SpringBootApplication
public class DemoApplication {
@Bean //放到 bean 中
public ViewResolver myViewResolver(){
return new MyViewResolver();
}
//我们写一个静态内部类,视图解析器就需要实现 ViewResolver 接口
private static class MyViewResolver implements ViewResolver {
@Override
public View resolveViewName(String s, Locale locale) throws Exception {
return null;
}
}
public static v 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 oid main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
(2)打断点测试
在 ApplicationDispatcher 类中的 doDispatch 方法进行打断点,因为所有的请求都会走到这个方法中
?
找到视图解析器,我们看到我们自己定义的就在这里了
?
故如果想要使用自己定制化的东西,我们只需要给容器中添加这个组件就好了!剩下的事情 SpringBoot 就会帮我们做了!
3.2 扩展使用 SpringMVC
介绍:
SpringBoot 在自动配置很多组件的时候,先看容器中有没有用户自己配置的(如果用户自己配置 @bean),如果有就用用户配置的,如果没有就用自动配置的;
如果有些组件可以存在多个,比如我们的视图解析器,就将用户配置的和自己默认的组合起来!
3.2.1 扩展使用
使用步骤:
(1)编写一个 @Configuration 注解类
(2)类型要为 WebMvcConfigurer,还不能标注 @EnableWebMvc 注解;
(1)创建一个包 config,编写我们自己的配置类
评论