SpringBoot | 4.1 SpringMVC的自动配置
前言
SpringMVC定位于一个较为松散的组合,展示给用户的视图(View)、控制器返回的数据模型(Model)、定位视图的视图解析器(ViewResolver)和处理适配器(HandlerAdapter)等容器都是独立的。换句话说,通过SpringMVC很容易把后台的数据转换为各种类型的数据,以满足移动互联网数据多样化的要求。
本篇仅为简单介绍SpringMVC的大致组件与流程,详细过程将在后续篇章一一道来。
1. SpringMVC框架的设计与流程
流程和组件是SpringMVC的核心,SpringMVC的流程是围绕DispatcherServlet而工作的。
1.1 SpringMVC框架的示意图

1.2 SpringMVC的组件流程

大致流程是:首先是定义请求分发,让SpringMVC能够产生HandlerMapping;其次是接收请求获取参数;再次是处理业务逻辑获取数据模型ModelAndView;最后是绑定视图和数据模型。
以上组件将会在后续文章讲解,这里仅做一个大概介绍。
| 组件名称 | 组件说明 |
|---|---|
| DispatcherServlet | 核心组件,前端控制器; |
| LocalResolver | 国际化解析器; |
| ThemeResolver | 主体解析器; |
| HandlerMapping | 处理器映射; |
| HandlerAdapter | 处理器适配器; |
| HandlerExceptionResolver | 处理器异常解析器; |
| RequestToViewNameTranslator | 策略视图名称转换器; |
| ViewResolver | 视图解析器; |
| FalshMapManager | 不常用,FlashMap管理; |
以上组件会在SpringMVC初始化时构建出来。
2. *自动配置的源码分析
SpringMVC的自动配置流程是类似第三章了数据库组件自动配置相关内容。
2.1 导入Web场景启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2 找到DispatcherServlet的属性文件
前面提到SpringMVC的核心是DispatcherServlet前端控制器,因此我们找到它的属性文件DispatcherServlet.properties:

它定义的对象在SpringMVC开始时就初始化,并且注册进Spring IoC容器中。此外,在这个jar包内定义了很多SpringMVC相关的组件。
3. 自动配置的官网描述
SpringBoot配置SpringMVC在SpringBoot官网已经说明了,可以参考以下翻译。
官网地址:7.1.1. Spring MVC Auto-configuration
Spring Boot provides auto-configuration for Spring MVC that works well with most applications.(SpringBoot为SpringMVC提供了自动配置,因此大多场景我们都无需自定义配置)
The auto-configuration adds the following features on top of Spring’s defaults:
(自动化配置包括以下默认特性)
Inclusion of
ContentNegotiatingViewResolverandBeanNameViewResolverbeans.- 内容协商视图解析器和BeanName视图解析器;
Support for serving static resources, including support for WebJars (covered later in this document)).
- 静态资源(包括webjars);
Automatic registration of
Converter,GenericConverter, andFormatterbeans.- 自动注册 Converter,GenericConverter,Formatter;
Support for
HttpMessageConverters(covered later in this document).- 支持 HttpMessageConverters(后续文章有内容协商原理分析);
Automatic registration of
MessageCodesResolver(covered later in this document).- 自动注册 MessageCodesResolver (国际化用,少用,一般直接开发两套页面);
Static
index.htmlsupport.- 静态index.html 页支持;
Custom
Faviconsupport (covered later in this document).- 自定义Favicon;
Automatic use of a
ConfigurableWebBindingInitializerbean (covered later in this document).- 自动使用 ConfigurableWebBindingInitializer,(DataBinder负责将请求数据绑定到JavaBean上);
If you want to keep those Spring Boot MVC customizations and make more MVC customizations (interceptors, formatters, view controllers, and other features), you can add your own
@Configurationclass of typeWebMvcConfigurerbut without@EnableWebMvc.不用@EnableWebMvc注解。使用@Configuration+WebMvcConfigurer自定义规则;
If you want to provide custom instances of
RequestMappingHandlerMapping,RequestMappingHandlerAdapter, orExceptionHandlerExceptionResolver, and still keep the Spring Boot MVC customizations, you can declare a bean of typeWebMvcRegistrationsand use it to provide custom instances of those components.声明WebMvcRegistrations改变默认底层组件;
If you want to take complete control of Spring MVC, you can add your own
@Configurationannotated with@EnableWebMvc, or alternatively add your own@Configuration-annotatedDelegatingWebMvcConfigurationas described in the Javadoc of@EnableWebMvc.使用@EnableWebMvc+@Configuration+DelegatingWebMvcConfiguration 全面接管SpringMVC;
4. 定制SpringMVC的初始化
Spring提供WebMvcConfigurer接口;对应SpringBoot提供WebMvcAutoConfiguration接口。
4.1 WebMvcConfigurer与WebMvcAutoConfiguration的关系图

在SpringBoot中,自定义通过配置类WebMvcAutoConfiguration定义的,它有一个静态的内部类WebMVCAutoConfigurationAdapter,通过它SpringBoot就自动配置了SpringMVC的初始化。
4.2 SpringMVC可配置项
在WebMVCAutoConfigurationAdapter类中,它会读入Spring配置SpringMVC的属此来初始化对应组件,这样便能够在一定程度上实现自定义。可配置项如下:

除此之外,还可以实现WebMvcConfigurer接口加入自己定义的方法。
最后
新人制作,如有错误,欢迎指出,感激不尽!
欢迎关注公众号,会分享一些更日常的东西!
如需转载,请标注出处!

SpringBoot | 4.1 SpringMVC的自动配置的更多相关文章
- SpringBoot中对SpringMVC的自动配置
https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#boot-features-developin ...
- java框架之SpringBoot(5)-SpringMVC的自动配置
本篇文章内容详细可参考官方文档第 29 节. SpringMVC介绍 SpringBoot 非常适合 Web 应用程序开发.可以使用嵌入式 Tomcat,Jetty,Undertow 或 Netty ...
- SpringBoot中SpringMVC的自动配置以及扩展
一.问题引入 我们在SSM中使用SpringMVC的时候,需要由我们自己写SpringMVC的配置文件,需要用到什么就要自己配什么,配置起来也特别的麻烦.我们使用SpringBoot的时候没有进行配置 ...
- 7、springmvc的自动配置
1.springmvc的自动配置 文档:https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot ...
- SpringMVC的自动配置解析
https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#boot-features-developin ...
- SpringBoot入门(四)——自动配置
本文来自网易云社区 SpringBoot之所以能够快速构建项目,得益于它的2个新特性,一个是起步依赖前面已经介绍过,另外一个则是自动配置.起步依赖用于降低项目依赖的复杂度,自动配置负责减少人工配置的工 ...
- 0011SpringBoot的@EnableWebMvc全面接管SpringMVC的自动配置(源码)
所谓的@EnableWebMvc全面接管SpringMVC的自动配置,是指@EnableWebMvc注解会使SpringMVC的自动配置失效,原理如下: 1.查看@EnableWebMvc的源码,如下 ...
- 接管SpringBoot对Activiti的数据源自动配置
SpringBoot的自动配置真的让人又爱又恨,但还是爱更多一点. SpringBoot想要帮我们自动配置好一切,但是有时候配置的却并不是我们需要的,甚至有时候会默默的坑我们. 我的项目是一个多数据源 ...
- springboot web项目创建及自动配置分析(thymeleaf+flyway)
@ 目录 源码分析 webjars thymeleaf thymeleaf语法 springmvc 启动配置原理 集成flyway插件 springboot 创建web项目只需要引入对应的web-st ...
随机推荐
- 6、inotify实时备份
备份用户nfs共享文件系统,存储单点解决方案inotify+rsync(增量,无差异备份),inotify是单线程, inotify是一种强大的,细粒度的,异步的文件系统事件监控机制,通过加入了ino ...
- 2018-10-14普及模拟赛」Hash 键值 (hash)
今天,带大家看一看一道思维题... Hash 键值 (hash) 题目描述 Marser沉迷hash无法自拔,然而他发现自己记不住hash键值了-- Marser使用的hash函数是一个单纯的取模运算 ...
- 二维动态规划&&二分查找的动态规划&&最长递增子序列&&最长连续递增子序列
题目描述与背景介绍 背景题目: [674. 最长连续递增序列]https://leetcode-cn.com/problems/longest-continuous-increasing-subseq ...
- hadoop学习(一)环境的搭建
1.安装几台Linux虚拟机.安装的过程就不赘述了,网上教程很多.win7系统上装了一个VMWare,因为一些原因,VMWare版本不是最新的,是VMWare7.1版本,由于VMWare版本不高,所以 ...
- leetcode 字符串转换整数 (模拟)
思路分析 1.跟着题意模拟,分成几种情况来看待 2.一种全是空格 3.有可能有空格,然后有符号的 4.有可能有空格,无符号数字 5.有可能有空格,非数字开头 6.最后还需要考虑一个越界的问题,所以要除 ...
- XXE学习(待更新)
XXE基础 XXE(XMl External Injection),即XML外部实体注入漏洞. XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体得加载,导致可以加载恶意外部文件,造成文件读取 ...
- JMeter之BeanShell常用内置对象
一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...
- 技能篇:docker的简易教程
虚拟机技术每家公司发展到一定规模都必须考虑的,更好的环境隔离,更好的事故排查,更好的服务部署 docker的原理 docker更换阿里源 docker容器的相关命令 Dockerfile文件编写 do ...
- python pycharm 正则表达式批量替换
{accept:application/json, text/plain, */*,accept-encoding:gzip, deflate, br,accept-language:zh-CN,zh ...
- C语言:extern应用
前面我们都是将所有的代码写到一个源文件里面,对于小程序,代码不过几百行,这或许无可厚非,但当程序膨胀代码到几千行甚至上万行后,就应该考虑将代码分散到多个文件中,否则代码的阅读和维护将成为一件痛苦的事情 ...