日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap

發布時間:2025/3/21 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Pre
  • 生命周期統一管理組件LifeCycle
  • 啟動入口類查找
  • 啟動流程分析
    • 啟動總覽
    • init 實例化 Bootstrap


Pre

上篇我們搭建了tomcat的源碼環境: Tomcat - 源碼構建Tomcat 8.5.55 啟動

接下來我們來分析一下tomcat的啟動過程。


回憶一下 tomcat的架構圖

Tomcat啟動的時候肯定要把架構中提到的組件進行實例化(實例化創建–>銷毀等:生命周期)。

Tomcat中那么多組件,為了統一規范他們的生命周期,Tomcat抽象出了LifeCycle生命周期接口 。


生命周期統一管理組件LifeCycle

查看LifeCycle的實現類 Hierarchy, 快捷鍵 Ctrl + H

是不是就和剛才架構中的組件對應上了?


啟動入口類查找

我們一linux操作系統為例,我們啟動tomcat都是執行 startup.sh 對吧

都是shell, 不難

繼續 catalina.sh start

到最后其實是執行了 java xxxx.jar org.apache.catalina.startup.Bootstrap(main) start(參數)

那就看Bootstrap的main方法吧


啟動流程分析

啟動總覽

骨干脈絡清楚了 ,看下具體實現咯


init 實例化 Bootstrap

從 Bootstrap#main() 進去 ,為了關注核心流程,精簡了一下

private static volatile Bootstrap daemon = null;Bootstrap bootstrap = new Bootstrap();bootstrap.init();daemon = bootstrap;

init 干了啥 ?

/*** Initialize daemon.* @throws Exception Fatal initialization error*/public void init() throws Exception {// 初始化類加載器initClassLoaders();// 設置類加載器Thread.currentThread().setContextClassLoader(catalinaLoader);SecurityClassLoad.securityClassLoad(catalinaLoader);// load org.apache.catalina.startup.CatalinaClass<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");// 實例化CatalinaObject startupInstance = startupClass.getConstructor().newInstance();// 方法名String methodName = "setParentClassLoader";// 參數Class<?> paramTypes[] = new Class[1];paramTypes[0] = Class.forName("java.lang.ClassLoader");Object paramValues[] = new Object[1];paramValues[0] = sharedLoader;// 獲取方法Method method =startupInstance.getClass().getMethod(methodName, paramTypes);// 方法調用method.invoke(startupInstance, paramValues);// 對象賦值catalinaDaemon = startupInstance;}

是不是很熟悉? 通過反射調用 org.apache.catalina.startup.Catalina#setParentClassLoader 方法 ,最后 catalinaDaemon = startupInstance; 賦值 , 事實上 后面調用的load 和 start方法 均為Catalina對象的load和start 方法。

總結

以上是生活随笔為你收集整理的Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。