SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理

 

http://www.zijin.net/news/tech/1088822.html

概述

  • SpringBoot使用main方法启动的一个重要特性是,不需要打包成war部署到Tomcat这种Servlet容器中,而是只需打包成jar,然后通过java或mvn等命令运行这个jar包,然后应用就可以在指定的端口监听客户端的连接请求了。
  • 在SpringBoot内部主要是引用了embedded的Tomcat或Jetty等作为Servlet引擎,由该Servlet引擎负责接收Web请求并交给应用处理和生成响应,从而可以将应用打包成jar,直接在命令行启动,以独立进程的方式运行,无需依赖Tomcat等Servlet容器,但是可以实现跟部署到Tomcat中的war包一样处理Web请求和响应。

接口设计

  • 在接口设计层面,对Spring容器而言,是通过拓展ApplicationContext接口来增加Spring容器对Servlet引擎的支持;对Servlet引擎而言,则是定义了WebServer接口来代表Servlet引擎或者说是Web服务器,WebServer接口实现类为具体的Servlet引擎实现。
  • Spring容器通过包含WebServer的引用来负责Servlet引擎的启动关闭。同时与普通Servlet容器实现(如Tomcat)一样,将Spring应用通过关联一个ServletContext引用来建立与Servlet引擎的关联,同时将自身保存为ServletContext引用的attribute。
  • 应用自身在启动的时候,会创建和启动Spring容器,在Spring容器中通过该WebServer引用来启动对应的Servlet引擎。并在启动Servlet引擎过程中,创建该应用对应的ServletContext,由该ServletContext来间接建立当前应用与Servlet引擎的关联。

Spring容器ApplicationContext体系

  • WebServerApplicationContext接口:定义获取WebServer引用的方法

SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理

 

 

  • ServletWebServerApplicationContext:WebServerApplicationContext接口的具体实现类,包含WebServer的引用,类定义如下:

SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理

 

 

  • 由继承体系可知,继承了GenericWebApplicationContext,在GenericWebApplicationContext中定义了ServletContext引用。
  • 由代码注释可知,Spring容器管理了一个ServletWebServerFactory引用,ServletWebServerFactory为WebServer实现类对象的工厂类,通过ServletWebServerFactory来创建servlet引擎WebServer,其中由ServletWebServerFactory创建的WebServer默认在8080端口监听请求,具体为在基类AbstractConfigurableWebServerFactory中定义。
  • 同时注册到Spring容器的Servlet,Filter接口的实现类会自动注册到Servlet引擎,具体为应用对应的ServletContext。
  • AnnotationConfigServletWebServerApplicationContext:基于注解的Spring容器,继承了ServletWebServerApplicationContext。
  • XmlServletWebServerApplicationContext:基于XML的Spring容器,继承了ServletWebServerApplicationContext。

Servlet引擎体系

  • WebServer接口:声明Servlet引擎启动,关闭的方法,相应的实现类实现这些方法来定义启动和关闭逻辑,而对Spring容器ServletWebServerApplicationContext而言,只需依赖这个接口即可,不依赖具体实现,这也是遵循了依赖倒置设计原则。

SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理

 

 

  • ServletWebServerFactory接口:Servlet引擎WebServer的工厂接口,接口定义如下,声明了getWebServer方法。也是遵循依赖倒置设计原则,即Spring容器ServletWebServerApplicationContext只依赖这个接口,具体为这个接口的getWebServer方法来获取一个Servlet引擎WebServer对象,而该接口的具体实现类,负责实现这个接口。实现类包括:TomcatServletWebServerFactory,JettyServletWebServerFactory,UndertowServletWebServerFactory,具体在embedded包定义。

SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理

 

 

Spring容器和Servlet引擎启动过程

  • Spring容器是在ApplicationContext的refresh方法定义启动流程的,具体为在AbstractApplicationContext中定义refresh方法的流程模板:关于Servlet引擎的启动,是在onRefresh和finishRefresh方法定义的,由onRefresh方法的注释可知,这个方法是设计用来注册有特殊功能的bean对象到Spring容器内部的BeanFactory的。所以Spring容器的设计拓展性是很好的。

SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理

 

 

  • ServletWebServerApplicationContext的refresh方法,onRefresh方法,finishRefresh方法。其中onRefresh方法负责Server引擎和ServletContext的创建;finishOnRefresh方法负责Servlet引擎的启动,即调用WebServer的start方法,然后在指定的端口,如8080,监听客户端的请求。

SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理

 

 

  • createWebServer方法实现:创建servlet引擎WebServer和ServletContext。

SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理

 

 

  • startWebServer方法实现:调用Servlet引擎的start方法完成启动。

SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理

 

 

  • 以下为TomcatWebServer的start方法实现:启动应用在Servlet规范中对应的Context,即TomcatEmbeddedContext

SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理

 

 

欢迎投稿本站:紫金网 » SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理