Spring Boot自动配置SpringMVC(一)
实际上在关于Spring Boot自动配置原理实战的文章Spring Boot自动配置实战 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中,可以看到我们使用到了@ReqeusMapping这类SpringMVC的注解,但是并没有对Spring MVC web.xml相关的配置,那么为什么能使用呢?可以预见的确定Spring Boot 帮助开发者做了web.xml的配置工作并且对@Controller标记的包进行了扫描。可以看到依赖文件中自动配置了如下starter:
如果不使用Spring Boot,一个普通的web项目如何使用Spring MVC呢?如果使用web.xml配置,需要做如下工作:
在文章SSM整合 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中,示例了利用idea工具将一般Java项目利用Spring MVC技术改变为Web项目。其中涉及的配置主要是web.xml和url与方法的映射配置。url与方法映射的配置(@Controller标记类)是开发者根据需求开发的,同时web.xml的关于Servlet配置对于绝大多数利用Spring MVC的web项目而言大致相同。
但是可以看到,Spring Boot项目中并没有xml相关配置文件的读取工作。这是为什么呢?这就与Servlet3.0规范有关了。通过web.xml配置可知其本身就是一个servlet的配置,应该符合servlet相关规范。那么Servlet3.0的规范提供了注解驱动功能,可以不在使用xml配置通过implements WebApplicationInitializer,直接使用servletContext.addServlet(name,this.servlet)类似即可。
SpringBoot就是通过servlet运行时插件动态地往web容器中添加一个DispatcherServlet对象,实现了自动装配Spring MVC了。
根据之前Spring Boot starter实战相关的步骤经验逆推,验证Spring MVC自动配置的原理。
一、注册配置
可以在spring boot自动配置包下spring.factories找到如下内容:
二、自动配置DispacherServlet类
@ConditionalOnClass条件注入DispacherServlet Bean,可参考文章Spring Boot 热插拔技术应用 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)
三、属性配置
从上图看,注解中没有关于属性配置的相关内容,那么这个自动配置都是默认固定的配置么?当然不是,看看这个类的类图:
这个类中有四个内部类,其中关注DispatcherServletRegistrationConfiguration 和DispatcherServletConfiguration两个类。
DispatcherServletRegistrationConfiguration类通过名字就可以猜测出功能是将servlet注册到容器中的注册类。Servlet实例要被注册到如tomcat这样的ServletContext里才能提供请求服务,所以这个类将生成一个Bean,负责通过servletContext.addServlet()方法将DispatcherServlet注册到ServletContext中。
DispatcherServletConfiguration就是配置DispatcherServlet。
这里分析DispatcherServletConfiguration配置类
@Conditional指明了一个前置条件判断,又DefaultDispatcherServletCondition实现。主要判断是否已经存在DispatcherServlet,如果没有才会除非解析。
@ConditionalOnClass指明当ServletRegistration这个类存在的时候才会触发生成的DispatcherServlet才能注册到ServletContext中。
@EnableConfigrationProperties将会从application.properties这样的配置文件中读取spring.mvc前缀的属性生成配置对象WebMvcProperties。
再看其内部代码:
这个就是典型的Java Bean方式注册Bean,生成了DispatcherServlet的Bean对象。
以上分析的都是自动配置的DispatcherServlet的Bean,其可使用还需注册到ServletContext对象中。上面分析源码中DispatcherServletRegistrationConfiguration提供该功能,下面分析该功能:
我们看看DispatcherServletRegistrationBean的类图:
看到ServletContextInitializer,我们可以知道ServletRegistrationBean实现了ServletContext的初始化(三大组件的注册),此处实现了Servlet的注册。具体可参考红框划出的代码,不细述。
至此,Spring MVC自动配置完成并可以在诸如tomcat的容器中使用。
Spring Boot自动配置SpringMVC(一)的更多相关文章
- Spring Boot自动配置SpringMVC(二)
Spring Boot自动配置SpringMVC(一) - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)讲述了关于DispatcherServlet注册到诸如tomcat容器中的自动配置过 ...
- Springboot 系列(三)Spring Boot 自动配置原理
注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring ...
- Spring Boot自动配置与Spring 条件化配置
SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...
- Spring Boot自动配置原理、实战
Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...
- Spring Boot自动配置
Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...
- Spring boot 自动配置自定义配置文件
示例如下: 1. 新建 Maven 项目 properties 2. pom.xml <project xmlns="http://maven.apache.org/POM/4 ...
- Spring Boot自动配置原理与实践(一)
前言 Spring Boot众所周知是为了简化Spring的配置,省去XML的复杂化配置(虽然Spring官方推荐也使用Java配置)采用Java+Annotation方式配置.如下几个问题是我刚开始 ...
- Spring Boot自动配置原理(转)
第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot- ...
- Spring Boot自动配置如何工作
通过使用Mongo和MySQL DB实现的示例,深入了解Spring Boot的@Conditional注释世界. 在我以前的文章“为什么选择Spring Boot?”中,我们讨论了如何创建Sprin ...
随机推荐
- 自动化集成:Pipeline整合Docker+K8S
前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述流水线集成K8S用法. 一.背景描述 分布式服务的部署 ...
- Ubuntu16桌面版编译和安装OpenCV4
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 网络编程-基于Websocket聊天室(IM)系统
目录 一.HTML5 - Websocket协议 二.聊天室(IM)系统的设计 2.1.使用者眼中的聊天系统 2.2.开发者眼中的聊天系统 2.3.IM系统的特性 2.4.心跳机制:解决网络的不确定性 ...
- jsp文本框输入限制问题
1.jsp文本窗口实现控制输入格式 <input onkeyup = "value=value.replace(/[\W]/g,'')" onbeforepaste=&quo ...
- 【记录一个问题】opencl的clGetPlatformIDs()在cuda 9下返回-1001(找不到GPU平台)
如题:在cuda9, nvidia驱动版本 384.81 的环境下运行opencl程序,在clGetPlatformIDs()函数中返回-1001错误. 把环境更换为cuda 10,驱动版本410.1 ...
- bit操作常见trick
x&(x-1)可以消去最右边的1, 如果判断一个数是否是2的指数的快捷方法,比如8,二进制位1000, 那么8&(8-1)为0,只要为0就是2的指数
- Redis作缓存
缓存策略三要素:缓存命中率 缓存更新策略 最大缓存容量.衡量一个缓存方案的好坏标准是:缓存命中率.缓存命中率越高,缓存方法设计的越好. 三者之间的关系为:当缓存到达最大的缓存容量时,会触发缓存更 ...
- 羽夏看Win系统内核——进程线程篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- Nginx代理的方式(反向代理)
目录 一:Nginx 正向代理与反向代理 1.什么是代理服务器? 2.正向代理的概念 3. 反向代理的概念 二:Nginx代理服务支持的协议 三:Nginx代理实践 1.部署web01 2.部署lb0 ...
- BeanUtils JavaBean 工具包使用
感谢原文作者:小老弟 原文链接:https://www.cnblogs.com/syncmr/p/10523576.html 目录 简介 BeanUtils类 使用示例 ConvertUtils 功能 ...