日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

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