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被内嵌在项目中,并不需要再去配置环境变量.
先看一段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作为一个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);
这是Tomcat官方文档中介绍的整个加载过程
这里也是官方提供的加载过程,过程比较繁琐
可以通过查看StandardServer#start()来了解服务器开启的过程。
如果跟踪代码就会发现:
Catalina#start()–àStandardServer#start()–àStandardService#start()
也就是Catalina对象执行start()期间,会调用StandardServer对象的start()方法。
StandardServer对象执行start()期间,会调用Server下的所有的StandardService对象的start()。