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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat - 源码构建Tomcat
- 下一篇: Tomcat - Tomcat 8.5.