实际上在关于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(一)的更多相关文章

  1. Spring Boot自动配置SpringMVC(二)

    Spring Boot自动配置SpringMVC(一) - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)讲述了关于DispatcherServlet注册到诸如tomcat容器中的自动配置过 ...

  2. Springboot 系列(三)Spring Boot 自动配置原理

    注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring ...

  3. Spring Boot自动配置与Spring 条件化配置

    SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...

  4. Spring Boot自动配置原理、实战

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

  5. Spring Boot自动配置

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

  6. Spring boot 自动配置自定义配置文件

    示例如下: 1.   新建 Maven 项目 properties 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4 ...

  7. Spring Boot自动配置原理与实践(一)

    前言 Spring Boot众所周知是为了简化Spring的配置,省去XML的复杂化配置(虽然Spring官方推荐也使用Java配置)采用Java+Annotation方式配置.如下几个问题是我刚开始 ...

  8. Spring Boot自动配置原理(转)

    第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot- ...

  9. Spring Boot自动配置如何工作

    通过使用Mongo和MySQL DB实现的示例,深入了解Spring Boot的@Conditional注释世界. 在我以前的文章“为什么选择Spring Boot?”中,我们讨论了如何创建Sprin ...

随机推荐

  1. 华为HMS Core全新推出会员转化&留存预测模型

    现在,付费学知识,付费听歌,付费看电视剧,付费享受线上购物优惠--等等场景已经成为大部分年轻人的日常. 而对于企业商家来说,付费会员作为企业差异化用户运营的手段,不仅有利于提升用户的品牌忠诚度,在当下 ...

  2. redis的bind误区

    对于Redis中bind的正确的理解是:bind:是绑定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址),而不是redis允许来自其他计算机的IP地址.如果指定了bi ...

  3. Vulnhub - THE PLANETS: EARTH

    环境配置 从www.vulnhub.com下载靶机,在VMware中导入,自动分配IP 主机发现 通过对内网主机的扫描,VMware为目标主机 端口扫描 使用nmap对主机进行扫描 发现443端口信息 ...

  4. 【vps】如何在vps上安装mirai机器人?

    [vps]如何在vps上安装mirai机器人? 前言 由于某位师傅在群里设置了一个bot,吸引了我,所以我之前找他问了点bot的相关知识,这几天正好服务器搬迁,所以就在新服务器上再装一遍bot 1.安 ...

  5. [C# 学习]委托和线程

    委托有点像C语言的函数指针,简单总结一下如何使用委托. 1. 声明一个委托 public delegate void LabelSetEventHandler(Label la, string str ...

  6. Spark-寒假-实验4

    1.spark-shell 交互式编程 (1)该系总共有多少学生: 执行命令: var tests=sc.textFile("file:///home/hadoop/studata/chap ...

  7. manjaro20软件商店无法链接下载

    软件商店如果无法链接下载 解决方案1 可以使用terminal慢慢下载,.bashrc中配置代理 如果依然不行,检查网络设置代理是否为自动或者手动设置正确. 解决方案2 检查是否未设置中国社区源或者重 ...

  8. CSS基本语法(二)

    目录 CSS基本语法(二) 八.CSS复合选择器 1.后代选择器** 2.子选择器 3.并集选择器** 4.伪类选择器 链接伪类选择器 :focus伪类选择器 总结 九.CSS的元素显示样式 1.概念 ...

  9. linux下查看开放的端口

    Nmap是一款针对大型网络的端口扫描工具,它也适用于单机扫描,它支持很多扫描,也同时支持性能和可靠性统计. [root@localhost ~]# yum install namp [root@loc ...

  10. IBM MQ常用运维命令

    创建队列管理器 crtmqm –q QMgrName -q是指创建缺省的队列管理器 删除队列管理器 dltmqm QmgrName 启动队列管理器 strmqm QmgrName 如果是启动默认的队列 ...