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

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原理图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

life or die

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值