SpringBoot启动Tomcat




启动入口是ServletWebServerFactory(TomcatServletWebServerFactory子类)#getWebServer方法

启动Tomcat是在启动SpringBoot 的 run方法过程中一起启动的

Tomcat上下文创建方法是SpringApplication#run(java.lang.String…)调用createApplicationContext()方法完成上下文创建(默认是AnnotationConfigEmbeddedWebApplicationContext)


上下文刷新方法是 SpringApplication#run(java.lang.String…)调用到refreshContext方法,调用到refresh方法,最终会调用到AbstractApplicationContext#refresh,然后调用ServletWebServerApplicationContext#onRefresh调用到createWebServer然后调用到getWebServerFactory获取到TomcatServletWebServerFactory工厂,然后调用getWebServer,启动Tomcat容器.



在getWebServer方法内部主要做两件事情,第一件事就是把Connnctor(我们称之为连接器)对象添加到Tomcat中,第二件事就是configureEngine.



阅读Tomcat的getServer()我们可以知道,Tomcat的最顶层是Server,Server就是Tomcat的实例,一个Tomcat一个Server;通过getEngine()我们可以了解到Server下面是Service,而且是多个,一个Service代表我们部署的一个应用,而且我们还可以知道,Engine容器,一个service只有一个;根据父子关系,我们看setHost()源码可以知道,host容器有多个;同理,我们发现addContext()源码下,Context也是多个;addServlet()表明Wrapper容器也是多个,而且这段代码也暗示了,其实Wrapper和Servlet是一层意思。另外我们根据setConnector源码可以知道,连接器(Connector)是设置在service下的,而且是可以设置多个连接器(Connector)。

Tomcat的启动主要是初始化2个核心组件,连接器(Connector)和容器(Container),一个Tomcat实例就是一个Server,一个Server包含多个Service,也就是多个应用程序,每个Service包含多个连接器(Connetor)和一个容器(Container),而容器下又有多个子容器,按照父子关系分别为:Engine,Host,Context,Wrapper,其中除了Engine外,其余的容器都是可以有多个。



根据上面分析,我们可以小结下: Tomcat主要包含了2个核心组件,连接器(Connector)和容器(Container),用图表示如下:

SpringBoot启动Tomcat - 图1


一个Tomcat是一个Server,一个Server下有多个service,也就是我们部署的多个应用,一个应用下有多个连接器(Connector)和一个容器(Container),容器下有多个子容器,关系用图表示如下:
SpringBoot启动Tomcat - 图2


Engine下有多个Host子容器,Host下有多个Context子容器,Context下有多个Wrapper子容器。