前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC源码学习(四)- SpringBoot的整合你真的会吗?

SpringMVC源码学习(四)- SpringBoot的整合你真的会吗?

作者头像
写一点笔记
发布2020-10-10 11:10:45
3570
发布2020-10-10 11:10:45
举报

通过前边三节的内容的分析,SpringMvc基本的过程我们已经大概了解了。那么在项目中是如何用SpringMvc的,是不是感到有一丝疑惑,我们好像并没有设置什么就直接启动就可以接受请求并进行响应。仔细想一下DispatcherServlet的初始化,也就是SpringMvc的九大组件。他们基本都先是通过IOC容器获取,如果获取不到就是用配置文件中设置的默认类。到这里我们就明白了,我们要想对SpringMvc的九大组件进行修改那么我们只需要将我们想要改的组件重新定义并注入到Spring IOC容器即可。

问题是我们项目中并没有直接的做那些工作,而是通过继承或者实现特定类或者接口来做这些工作。显然这些继承类或者实现的接口会将我们的操作或者返回的对象注入到Spring上下文中。目前我的猜测是这样的,那就究竟是否如此还需要看看源码!期待发现一些他们知道但我们还不知道的东西。

在项目中我们一般整合SpringMvc要么实现WebMvcConfig接口要么继承WebMvcConfigSupport接口,除此之外还有一个过时的WebMvcConfigAdapter。既然都是想SpringMVC的九大组件设置值得搞那么复杂有什么意义?难道就没有一个准么。我们先逐个看看这里边有什么差别。

发现接口WebMvcConfig都是虚方法,需要我们自己去实现。当然如果我们不实现的话就会采用配置文件中的默认值了。那么这个是怎么整合进去的?想必肯定有个@Configration的配置可是它在哪里?

通过查阅相关资料发现SpringBoot中有一个类WebMvcAutoConfiguration

如上图所示,这个WebAutoConfiguration会在类级别注解扫描的时候被扫描到,但是它和webmvcConfigurationSupport是不兼容的,所以这个类只对WebMvcConfigurer起作用。更近一步,我们找找在那块将我们的定义类放到IOC中。我们发现最下边有个类级别注释。

我们先看看这个Import类到底是什么,如下图所示,这块产生了很多Bean,显然这块应该和我们定义的部分有关系,但是我们项目中配置类实现接口,然后通过@Configuration注入到了Spring上下文中,现在这块就要将我们设置的配置逐个的暴露出来,那么它是如果注入的?

我们查看一下父类,果然发现了注入了我们放到IOC容器中的mvc配置类哦。意思就是说我们可以写多个mvc的配置类,更具有操作性的说法就是我们可以多写几个实现了webmvcconfiguere接口的类。我们看到注入之后就把注入的实体交给configurers。

通过查看webmvcCongurerComposit类,发现这个类就是一个mvc配置的统一处理工具类。就是对每个mvc的配置进行配置。但是让我迷惑的是上篇文档中的设置拦截器的方法是谁调用的。按理说这块添加进去之后。就可以设置了,但是目前还没有发现。

经过不断的思考最终还是在父类中找到了设置拦截器的方法。 就是说我们在AutoWebConfigurationAdapter中就在父类中就将值设置进去并将AbstractMappingHandler的实现类注入到Spring上下文中。其他的配置比如mvcViewResolver还有BeanNameUrlHandlerMapping等全部注入到IOC中。


那么如果我们直接继承WebMvcConfigurationSupport会怎样?

首先我们要知道我们的AutoWebMvcConfiguration是不会起作用了。但是我们发现WebMvcConfigurationSupport中有很多@Bean的注解,意思就是说只要我们的自定义类上具有@Configuration注解就可以独善其身了。毕竟WebMvcConfigurationSupport里包含了很多组件。直接用就好了。当然如果我们需要自定义的话就得重写,当然必须要对一些组件特别了解,否则可能会出问题。

一点小发现:

在阅读源码的过程中,我们发现在消息的转化中其实也可以不用继承或者实现接口哦!

总结:SpringMVC通过自动配置类AutoWebMvcConfiguration来将我们需要自定义的SpringMVC组件进行对外暴露。目前有两种方式用于对外暴露,一种是实现WebMvcConfiguere接口,这种方式通过@Autowired注入到类DelegatingWebMvcConfiguration中,然后通过父类WebMvcConfigurationSupport进行对IOC暴露自定义的组件,因为其包含了很多组件,所以直接赋值之后直接对spring注册就好了,但是这种方式不能和第二种方式共存,但可以多实例存在,因为注入的时候是以list的方式注入的。第二种方式是继承WebMvcConfigurationSupport,因为WebMvcConfigurationSupport包含了很多@Bean的对Spring注册,所以可以直接使用,但对于比较复杂的方法重写上需要足够的了解才可以。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员备忘录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档