目录
- SPI
- ServiceLoader
- Servlet规范
- Tomcat与MVC
- ServletContainerInitializer
- tomcat结合mvc启动
- tomcat如何切入进来
- Servlet与Spring定义的Servlet
- tomcat启动
- 示意图
SPI
全称为:Service Provider Interface(服务提供接口)
- 接口工程:提供接口
- 实现工程:实现接口,不同的实现工程,接口实现不同(META-INF/services 创建文件 接口名作为文件名 实现类全路径作为文件内容)
- 客户端:引用不同的实现工程,就可以有多个不同的实现方式
ServiceLoader
load()指定一个接口,它就会加载当前系统里面所有的这个接口的指定实现
Servlet规范
- Servlet创建对象
- Servlet要调用init方法初始化
- 每次的网络请求过来要调用service方法进行处理
- 停止应用(例如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是接口,其余是抽象类)
Servlet
定义了最初始重要的五个方法留给子类去实现GenericServlet
定义了一个简单版本的servlet但是无法使用,允许你继承实现这个接口去扩展(init方式是空的)HttpServlet
没有提供init初始化方法的实现,把service处理进一步细化,分为get,post等等
- 属于Spring的Servlet
HttpServletBean
重写了init方法,并且继续给子类留下了模板方法initServletBean
由子类去任意发挥FrameworkServlet
重写了上面留下的模板方法initServletBean,在这个里面调用了initWebApplicationContext()
方法初始化了整个的WebIOC容器,此时就会启动IOC容器(最后继续给子类留下一个模板方法initFrameworkServlet
)DispatcherServlet
类没有再去实现initFrameworkServlet
模板方法,整个IOC的初始化在上一步就完成了
tomcat启动
- tomcat在启动的时候,会为每一个Servlet创建对象
- tomcat自然会给
DispatcherServlet
(tomcat保证的单实例)创建对象 DispatcherServlet
一定会初始化(上述的Servlet结构中,就会初始化整个WebIOC容器)- 开始IOC容器刷新的12大步骤,所有的组件都要创建和就绪