入口一般都是main方法,看源码得知,入口是Bootstrap类的main方法,如图:
最重要的三个步骤就是 init、load 和 start 方法,这三个方法都是通过反射调用catalina中的init、load和start方法,作用分别是:
2、设置catalinaLoader(名称是server)当前线程的上下文加载器
3、实例org.apache.catalina.startup.Catalina 对象,加载器是catalinaLoader,并设置sharedLoader为其父类加载器
1、解析tomcat目录conf/server.xml文件生成Digester对象,其中包含server、listener、service、engine(container)和connector等信息
2、初始化StandardServer,也就是调用initInternal方法,最终 connector 中 ip 和 port 绑定到 Socket上,等待网络请求的到来
1、调用StandServer的startInternal方法启动
从图上可知,tomcat架构总体上来说是:Server -> Services -> connectors 和 engine(container),其中server 和 service 的实现类分别是 StandardServer 和 StandardService,架构中最核心的两个组件就是 connector 和 engine(container),后面分别介绍这两个组件,简化图如下:
三、tomcat类加载器,这个直接看单独的tomcat9类加载器文章
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 上,等待网络请求的到来。