tomcat9源码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ywlmsm1224811/article/details/91384227

一、tomcat入口

入口一般都是main方法,看源码得知,入口是Bootstrap类的main方法,如图:

最重要的三个步骤就是 init、load 和 start 方法,这三个方法都是通过反射调用catalina中的init、load和start方法,作用分别是:

init 方法

1、初始化classLoader

2、设置catalinaLoader(名称是server)当前线程的上下文加载器

3、实例org.apache.catalina.startup.Catalina 对象,加载器是catalinaLoader,并设置sharedLoader为其父类加载器

load方法

1、解析tomcat目录conf/server.xml文件生成Digester对象,其中包含server、listener、service、engine(container)和connector等信息

2、初始化StandardServer,也就是调用initInternal方法,最终 connector 中 ip 和 port 绑定到 Socket上,等待网络请求的到来

start方法

1、调用StandServer的startInternal方法启动

二、tomcat架构

从图上可知,tomcat架构总体上来说是:Server -> Services -> connectors 和 engine(container),其中server 和 service 的实现类分别是 StandardServer 和 StandardService,架构中最核心的两个组件就是 connector 和 engine(container),后面分别介绍这两个组件,简化图如下:

三、tomcat类加载器,这个直接看单独的tomcat9类加载器文章

四、catalina 的 load 方法

1、init 方法做了哪些事情上面我们已经讲得比较请求,下面着重介绍一下 load 方法的过程:

我们知道 load 方法是通过反射调用 catalina 中的load方法的,如下图:

2、catalina中的load方法调用 StandardServer的 initInternal 方法, StandardServer的 initInternal 方法又调用 StandardService 的 initInternal 方法,StandardService 的 initInternal 方法又调用 standardEngine、Executor、MapperListener 和 connector 的init 方法,如下图:

3、以上所有的init 方法中都会调用 super.initInternal 方法,那么该方法是做什么的,其实就是将bean注册到Bean管理器中,方便bean管理,源码如下:

4、StandardServer中最重要是就是调用 connector 的 init 方法,下面分析一下 connector 的 initInternal 方法具体做了哪些事情,

5、最终我们跟断点到 NioEndPoint 类中 bind 方法,这个方法是很重要,主要是将 server.xml 中connector 中配置的 ip 和 port 绑定到 Socket上去,以便监听端口请求处理

结论:通过以上分析可以得知, load 方法主要是 NioEndPoint 类中 初始化 connector 中的 ip 和 port 绑定到 socket 上,等待网络请求的到来。

五、tomcat请求过程,其中包含 Catalina 的 start方法整个讲解,见tomcat9请求过程源码

猜你喜欢

转载自blog.csdn.net/ywlmsm1224811/article/details/91384227