Spring源码学习-SPI机制与Tomcat结合SpringMVC原理剖析

目录

      • SPI
        • ServiceLoader
      • Servlet规范
      • Tomcat与MVC
          • ServletContainerInitializer
        • tomcat结合mvc启动
          • tomcat如何切入进来
          • Servlet与Spring定义的Servlet
          • tomcat启动
      • 示意图

SPI

全称为:Service Provider Interface(服务提供接口)

  • 接口工程:提供接口
  • 实现工程:实现接口,不同的实现工程,接口实现不同(META-INF/services 创建文件 接口名作为文件名 实现类全路径作为文件内容)
  • 客户端:引用不同的实现工程,就可以有多个不同的实现方式

ServiceLoader

load()指定一个接口,它就会加载当前系统里面所有的这个接口的指定实现

Servlet规范

  1. Servlet创建对象
  2. Servlet要调用init方法初始化
  3. 每次的网络请求过来要调用service方法进行处理
  4. 停止应用(例如tomcat停机)调用destroy进行销毁

Tomcat与MVC

ServletContainerInitializer

这个接口的所有实现是Tomcat使用SPI机制加载的

tomcat结合mvc启动

tomcat如何切入进来
  • Servlet规范ServletContainerInitializer处理@HandlesTypes,这个接口的所有实现是Tomcat使用SPI机制加载的
  • spring-web在类路径下指定了上述SPI的实现,指定的类为SpringServletContainerInitializer
  • 这个类通过规范中的@HandlesTypes注解去找到所有实现WebApplicationInitializer.class接口的类(遍历查找)
  • WebApplicationInitializer接口定义了onStartup方法,可以供我们干预进来servlet的初始化操作(会遍历执行所有实现此接口的onStartup方法)
Servlet与Spring定义的Servlet
  • 属于Java的Servlet(servlet是接口,其余是抽象类)
  1. Servlet定义了最初始重要的五个方法留给子类去实现
  2. GenericServlet定义了一个简单版本的servlet但是无法使用,允许你继承实现这个接口去扩展(init方式是空的)
  3. HttpServlet没有提供init初始化方法的实现,把service处理进一步细化,分为get,post等等
  • 属于Spring的Servlet
  1. HttpServletBean重写了init方法,并且继续给子类留下了模板方法initServletBean由子类去任意发挥
  2. FrameworkServlet重写了上面留下的模板方法initServletBean,在这个里面调用了initWebApplicationContext()方法初始化了整个的WebIOC容器,此时就会启动IOC容器(最后继续给子类留下一个模板方法initFrameworkServlet)
  3. DispatcherServlet类没有再去实现initFrameworkServlet模板方法,整个IOC的初始化在上一步就完成了

DispatcherServlet

tomcat启动
  1. tomcat在启动的时候,会为每一个Servlet创建对象
  2. tomcat自然会给DispatcherServlet(tomcat保证的单实例)创建对象
  3. DispatcherServlet一定会初始化(上述的Servlet结构中,就会初始化整个WebIOC容器)
  4. 开始IOC容器刷新的12大步骤,所有的组件都要创建和就绪

示意图

SpringMVC原理图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27416.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码在边缘计算工业软件中的应用

近年来,边缘计算给工业现场带来了许多新的变化。由于计算、储存能力的大幅提升,边缘计算时代的新设备往往能够胜任多个复杂任务。另外,随着网络能力的提升,边缘设备与设备之间、边缘设备与工业互联网云平台之间的通讯延迟与带宽都…

在Linux下做性能分析1:基本模型

介绍 本Blog开始介绍一下在Linux分析性能瓶颈的基本方法。主要围绕一个基本的分析模型,介绍perf和ftrace的使用技巧,然后东一扒子,西一扒子,逮到什么说什么,也不一定会严谨。主要是把这个领域的一些思路和技巧串起来。…

APP开发的成本:全面预算指南

最近,我遇到了很多人在谈论一个重要的话题:“为什么有些人没有 APP开发,而有些人却有?” 我们讨论了预算、竞争、市场趋势以及开发人员如何平衡自己的职责。现在,我将就如何让你的 APP开发项目变得更好,让…

datatables.editor 2.2 for PHP/JS/NodeJS Crack

使用数据表编辑器在几分钟内创建自定义、完全可编辑的表 编辑器添加了三种编辑模式,以适应任何类型的应用程序 新增功能 编辑 删除 搜索: 名字位置办公室开始日期工资名字位置办公室开始日期工资佐藤爱里会计东京2008-11-28$162,700安吉莉卡拉…

艺术欣赏|东风至,乘风起

《东风遂》60x50cm陈可之•1997年绘“大鹏一日同风起,扶摇直上九万里”。油画《东风遂》是陈可之先生三峡系列作品之一,通过描绘雄鹰搏击长空、翱翔天际时的英姿以及地面山河的壮丽,抒发心中豪迈壮阔的情怀,同时也在向世人传递东风…

【C#】并行编程实战:使用并发集合

在上一章的并行编程实现里,为了保护资源,我们对共享资源加锁(各种同步原语)来进行保护,避免多线程同时访问(主要是写入)。但一般来说,共享资源是一个可以由多个线程读写的集合&#…

composer的劈坑

现在是php8盛行的天下,安装php8我就不多说了,宝塔、小出面板一大堆,一键安装。真心说方便。(好吧,不打广告了),以下是针对 linux 系统 1、安装composer 安装composer之前,需要要先在…

Apache Doris (三十):Doris 数据导入(八)Spark Load 3- 导入HDFS数据

目录 1. 准备HDFS数据 2. 创建Doris表 3. 创建Spark Load导入任务 4. 查看导入任务状态 进入正文之前,欢迎订阅专题、对博文点赞、评论、收藏,关注IT贫道,获取高质量博客内容! 宝子们订阅、点赞、收藏不迷路!抓紧…

.net core 2.1 简单部署IIS运行

netcore的项目不像netFramework那么方便部署到iis还是要费点功夫的 比如我想把这个netcore2.1的项目部署到iis并运行: 按照步骤走: 一、确认自己的netcore环境 1、需要安装下面3个环境包(如果电脑已安装请忽略) 检查是否安装cmd命令:cmd&…

Spring @Autowired 注解原理

Spring Autowired 注解原理 1.Autowired 使用 ComponentScan("org.example.bean") public class AnnoContextDemo {Autowiredprivate User user;public static void main(String[] args) {AnnotationConfigApplicationContext context new AnnotationConfigApplic…

Sentinel流量规则模块(新增)

系统并发能力有限,比如系统A的QPS支持1个请求,如果太多请求过来,那么系统A就应该进行流量控制了,比如其他请求直接拒绝 新增流控规则介绍:新增流控规则窗口 1.资源名:默认请求路径。 2.针对来源:Se…

四维轻云地理空间数据在线协作管理平台为测绘行业用户解决了这些难题

测绘作为一个基础性行业,从大比例的地形图到铁路网、公路网的分布,再到互联网地图,测绘的身影随处可见。随着科技的不断发展与进步,无人机也成为测绘行业的一部分。通过无人机测绘技术能够获取高精度的影像数据并生成三维模型和点…