博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC源码学习(四)- SpringBoot的整合你真的会吗?
阅读量:4212 次
发布时间:2019-05-26

本文共 2117 字,大约阅读时间需要 7 分钟。

通过前边三节的内容的分析,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注册,所以可以直接使用,但对于比较复杂的方法重写上需要足够的了解才可以。

转载地址:http://vhkmi.baihongyu.com/

你可能感兴趣的文章
Struts2 标签库讲解
查看>>
Google Web工具包 GWT
查看>>
材料与工程学科相关软件
查看>>
windows 下AdNDP 安装使用
查看>>
Project 2013项目管理教程(1):项目管理概述及预备
查看>>
ssh客户端后台运行
查看>>
【React Native】把现代web科技带给移动开发者(一)
查看>>
【GoLang】Web工作方式
查看>>
Launch Sublime Text 3 from the command line
查看>>
【数据库之mysql】mysql的安装(一)
查看>>
【数据库之mysql】 mysql 入门教程(二)
查看>>
【HTML5/CSS/JS】A list of Font Awesome icons and their CSS content values(一)
查看>>
【HTML5/CSS/JS】<br>与<p>标签区别(二)
查看>>
【HTML5/CSS/JS】开发跨平台应用工具的选择(三)
查看>>
【心灵鸡汤】Give it five minutes不要让一个好主意随风而去
查看>>
【React Native】Invariant Violation: Application AwesomeProject has not been registered
查看>>
【ReactNative】真机上无法调试 could not connect to development server
查看>>
【XCode 4.6】常用快捷键 特别是格式化代码ctrl+i
查看>>
【iOS游戏开发】icon那点事 之 实际应用(二)
查看>>
【iOS游戏开发】icon那点事 之 图标设计(三)
查看>>