Tomcat源碼分析 · 貳 —— 啟動(dòng)過程剖析

前言
今天我們來繼續(xù)分析tomcat源碼,昨天我們已經(jīng)分析完了它的啟動(dòng)腳本和其中的init方法,我們現(xiàn)在知道init其實(shí)就是進(jìn)行了ClassLoader的初始化操作,其中資源路徑來源于catalina.properties文件,同時(shí)我們還知道最終初始化的ClassLoader是URLClassLoader。
下面我們來看下Tomcat啟動(dòng)過程中的其他操作。
Tomcat
昨天關(guān)于init方法還沒講完,所以今天先要繼續(xù)分析剩余內(nèi)容。
init方法補(bǔ)充
關(guān)于init方法其實(shí)昨天基本上已經(jīng)分析完了,因?yàn)樽蛱旌蟀攵味荚诜治?code style="overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">initClassLooders方法,所以今天回過頭再來補(bǔ)充下init后續(xù)的其他方法。

首先是setContextClasserLoader,這里的操作其實(shí)就是設(shè)置容器的類加載器,而這里的類加載器就是intiClassLoaders中生成的創(chuàng)建的類加載器。這個(gè)方法方法就是一個(gè)簡單賦值操作就不展開講了,需要注意的是這里獲取并建議了java的安全策略管理器:

然后是加載類的操作securityClassLoad,這里也校驗(yàn)了安全策略管理器,下面截圖已經(jīng)詳細(xì)展示了每一個(gè)操作具體加載的包,然后通過類的加載方法loadClass加載對應(yīng)包下的類:

再接著,通過catalinaLoader類加載器,加載了org.apache.catalina.startup.Catalina,并創(chuàng)建它的實(shí)例,最后反射調(diào)用它的setParentClassLoader方法,設(shè)置父級類加載器為java.lang.ClassLoader,最終將實(shí)例化結(jié)果賦值給BootStrap的catalinaDaemon屬性,至此init方法執(zhí)行完成。
繼續(xù)main方法
執(zhí)行完bootstrap的初始化操作之后,會把bootstrap賦值給daemon,然后緊接著會解析command命令,分別執(zhí)行它的setAwait、 load和start方法,這里調(diào)用方式都是反射,最終都調(diào)用的是catalinaDaemon實(shí)例對應(yīng)的方法:

我們先看下setAwait方法,這里的catalinaDaemon就是前面我們實(shí)例化的org.apache.catalina.startup.Catalina,然后反射調(diào)用它的setAwait方法:

load方法調(diào)用也差不多:

start方法也是一樣的:

好了,今天就先分享這么多,明天我們在深入剖析下catalina中對應(yīng)方法的實(shí)現(xiàn)。
總結(jié)
從目前來看,Tomcat的啟動(dòng)過程確實(shí)筆記簡單,短短幾行代碼就啟動(dòng)成功了,不過核心的功能應(yīng)該還在后面,讓我們拭目以待吧。
最后再探討一個(gè)非技術(shù)問題,這兩天看源碼一直有個(gè)問題,為啥Tomcat中有很多變量都用到了catalina這個(gè)單詞,是有什么特殊含義嗎?百度之后,發(fā)現(xiàn)catalina直接翻譯過來就是凱特琳娜,所以網(wǎng)上有兩種說法,一種說法是開發(fā)者老婆的名字叫凱特琳娜,一種說法是美國西海岸有一個(gè)叫catalina的小島,開發(fā)者比較喜歡那里,所以叫這個(gè)名字。我覺得第一種可能性還是蠻高的,畢竟Tomcat本身就是作者養(yǎng)的一只貓的名字,所以catalina是他老婆的名字也很順理成章,而且這也算是程序員的浪漫吧!我的變量里面有你的影子……
