SpringBoot内嵌的Tomcat启动过程及其做过的工作

SpringBoot内嵌的Tomcat启动过程及其做过的工作

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器.(来源于百度百科)

tomcat在web应用开发中是个再熟悉不过的软件了,我们理解它是一个容器,java程序并不是一个脚本语言,java代码要跑在这个容器内,我们要使用tomcat时需要配置环境,在springBoot中,tomcat被内嵌在项目中,并不需要再去配置环境变量.

一.Spring boot内嵌Tomcat的启动过程

先看一段springBoot项目的启动日志

org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:89) - Tomcat initialized with port(s): 8066 (http)  **1**

org.apache.catalina.core.StandardService.log(DirectJDKLog.java:179) - Starting service [Tomcat]  **2**

org.apache.catalina.core.StandardEngine.log(DirectJDKLog.java:179) - Starting Servlet Engine: Apache Tomcat/8.5.23 **3**

org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].log(DirectJDKLog.java:179) - Initializing Spring embedded WebApplicationContext **4**

org.springframework.web.context.ContextLoader.prepareEmbeddedWebApplicationContext(EmbeddedWebApplicationContext.java:276) - Root WebApplicationContext: initialization completed in 4704 ms **5**

1.初始化Tomcat,并且给给分配端口号(8066)

2.启动Tomcat

3.启动tomcat引擎(显示tomcat版本,springBoot1.5.9内嵌的是tomcat/8.5.23)

**4.**springBoot项目前期环境准备完成,初始化springWeb内嵌的上下文容器.

**5.**RootWebSpring上下文初始化完成.

这几步都是排在项目启动最前面的几步里,可以看出tomcat是项目启动的重要环节,初始化加载完成tomcat之后,下面开始加载项目中定义的Filter,component等等.

二.tomcat启动后,在项目中都做了那些工作

tomcat作为一个web容器,我们在请求调用接口的时候都是使用TCP链接达到通讯的目的,tomcat提供了很多顶层的接口来实现在实际中的应用.

通过网上的了解,知道了Tomcat主要的接口有:

·Server、Service、Container、Connector、Lifecycle、Executor、Engine、Host、Context、Wrapper、Value以及他们之间的关系。

在我们前面看到了spring项目启动tomcat的大致过程,这个Tomcat启动的过程大概是做了这么几件事:

Tomcat启动过程可以简化为3个步骤:

1)初始化守护进程,其实就是初始化类加载器

2)加载相关配置文件,初始化几个主要的顶层接口实例,简单了说,就是服务器初始化。

3)启动那些有生命周期的顶层实例,监听用户请求,简单了说,就是启动服务器。

这里的监听用户请求其实就是监听tomcat在初始化时候分配的端口(8066);

1.初始化类加载器


这是Tomcat官方文档中介绍的整个加载过程

2.服务器初始化


这里也是官方提供的加载过程,过程比较繁琐

3.服务器开启

可以通过查看StandardServer#start()来了解服务器开启的过程。

如果跟踪代码就会发现:

Catalina#start()–àStandardServer#start()–àStandardService#start()

也就是Catalina对象执行start()期间,会调用StandardServer对象的start()方法。

StandardServer对象执行start()期间,会调用Server下的所有的StandardService对象的start()。

你可能感兴趣的:(技术杂谈)