当前位置: 首页 > news >正文

springboot源码理解十二、springMVC功能

springMVC功能

  • DispatcherServlet加载到Spring IoC容器
    • springMVC自动配置类
      • DispatcherServletAutoConfiguration.DispatcherServletConfiguration
      • DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration
  • DispatcherServlet注册到servlet容器tomcat
    • ServletContextInitializer
    • onRefresh

springboot版本:2.2.9.RELEASE。

回忆一下,我们在普通的web项目中是如何使用springMVC的,
首先需要在web.xml中配置DispatcherServlet,

<servlet>
	<servlet-name>springMVC</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>springMVC</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

但是在springboot中没有web.xml文件,那我们如何去配置一个DispatcherServlet?

servlet实例是需要添加/注册到像tomcat这样的servletContext中,才能对外提供服务的。
在Servlet3.0规范中,提供了另外一种添加servlet的方式,
类似这样子:

servletContext.addServlet(name, this.servlet);

在Servlet3.0规范中,
容器启动时会自动扫描所有已添加的jar包下META-INF\services\javax.servlet.ServletContainerInitializer中指定的类的全路径,
实例化该类,然后回调META-INF\services\javax.servlet.ServletContainerInitializer中指定的ServletContainerInitializer的实现类的onStartUp方法。
在这里插入图片描述
在这里插入图片描述
如果我们能动态地往web容器中添加一个我们构造好的DispatcherServlet对象,就能实现springMVC配置了。

分两步:
1、DispatcherServlet加载到Spring IoC容器;
2、DispatcherServlet注册到servlet容器tomcat

DispatcherServlet加载到Spring IoC容器

springMVC自动配置类

打开spring-boot-2.2.9.RELEASE\spring-boot-project\spring-boot-autoconfigure\src\main\resources\META-INF\spring.factories,
DispatcherServletAutoConfiguration就是DispatcherServlet的自动配置类。
在这里插入图片描述
DispatcherServletAutoConfiguration
在这里插入图片描述
看下它的内部类,

DispatcherServletAutoConfiguration.DispatcherServletConfiguration

在这里插入图片描述
spring启动时会将DispatcherServlet加载到IoC容器中去。

DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration

在这里插入图片描述
spring启动时会将DispatcherServletRegistrationBean加载到IoC容器中去,
DispatcherServletRegistrationBean是DispatcherServlet它的一个注册类,
负责将DispatcherServlet注册到ServletContext中。

DispatcherServlet注册到servlet容器tomcat

ServletContextInitializer

我们先来看下DispatcherServletRegistrationBean的类关系图,
在这里插入图片描述
发现它是ServletContextInitializer的一个实现类,

ServletContextInitializer和我们上边提到过的ServletContainerInitializer的作用类似,
我们看下ServletContainerInitializer,
发现只有一个onStartup方法。
在这里插入图片描述
我们根据DispatcherServletRegistrationBean的类关系图查看它的实现方法,

org.springframework.boot.web.servlet.ServletContextInitializer#onStartup

org.springframework.boot.web.servlet.RegistrationBean#onStartup
在这里插入图片描述

org.springframework.boot.web.servlet.DynamicRegistrationBean#register
在这里插入图片描述

org.springframework.boot.web.servlet.ServletRegistrationBean#addRegistration

终于到了这一步,就是在这儿把DispatcherServlet注册到servlet容器的。
在这里插入图片描述
那ServletContainerInitializer.onStartup是在什么时候被调用的?

我们还得回到AbstractApplicationContext#refresh这一步。

onRefresh

SpringBootMytestApplication#main

SpringApplication#run(java.lang.Class<?>, java.lang.String...) → SpringApplication#run(java.lang.Class<?>[], java.lang.String[])

SpringApplication#run(java.lang.String…)

SpringApplication#refreshContext

SpringApplication#refresh

AbstractApplicationContext#refresh

ServletWebServerApplicationContext#onRefresh

ServletWebServerApplicationContext#createWebServer
在这里插入图片描述

org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#getSelfInitializer

org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#selfInitialize
在这里插入图片描述
这一步就是获取ServletContextInitializer,执行onStartup方法,
至此,DispatcherServlet就注册到servletContext了。

相关文章:

  • 论文写作教程之学术论文中需要做好的10 件事
  • AutoAugment 学习
  • 产品经理认证(NPDP)—备考错题集二
  • R语言ggplot2可视化:使用ggpubr包的ggmaplot函数可视化MA图(MA-plot)、genenames参数配置点标签对应的基因名称
  • 程序兼容性的定义 windows7的兼容性
  • 【C#】接口的基本概念
  • 四嗪 PEG 接头 下篇:Tetrazine-PEG5-NH-CH2CH2-4-Phenol试剂
  • MySQL数据库忘记密码怎么办?教你一招
  • 闭关之 C++ 并发编程笔记(五):并行算法函数与测试
  • JAVA使用xstream进行对象和xml互相转换
  • Git的进一步使用
  • ThinkPHP5.1 交互式命令
  • 语音短信怎么发?互亿无线
  • iOS16.0.2正式版突然发布,紧急修复这4个问题
  • 谷粒商城 高级篇 (二十二) --------- 支付
  • $translatePartialLoader加载失败及解决方式
  • [LeetCode] Wiggle Sort
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【Amaple教程】5. 插件
  • Apache的80端口被占用以及访问时报错403
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Java面向对象及其三大特征
  • ng6--错误信息小结(持续更新)
  • python_bomb----数据类型总结
  • Redux系列x:源码分析
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • yii2权限控制rbac之rule详细讲解
  • 翻译--Thinking in React
  • 使用agvtool更改app version/build
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 一个完整Java Web项目背后的密码
  • Java总结 - String - 这篇请使劲喷我
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #NOIP 2014# day.2 T2 寻找道路
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (TOJ2804)Even? Odd?
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (论文阅读11/100)Fast R-CNN
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)h264中avc和flv数据的解析
  • (转)VC++中ondraw在什么时候调用的
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • ****Linux下Mysql的安装和配置
  • *上位机的定义
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net 知识杂记
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • @angular/cli项目构建--Dynamic.Form