写点什么

SpringBoot-MVC 自动配置原理

  • 2022 年 5 月 16 日
  • 本文字数:1669 字

    阅读完需:约 5 分钟

想要学到更多后端知识,欢迎关注【一心同学】


??????感谢各位大可爱小可爱!???????




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,编写我们自己的配置类

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot-MVC自动配置原理_Java_爱好编程进阶_InfoQ写作社区