tomcat的啓動過程


一、我們知道,tomcat可以由org.apache.catalina.startup.Bootstrap這個類啓動,這個類型做了兩件事情:

1、指定classloader

2、引導Catalina啓動,使用reflection反射技術,調用org.apache.catalina.startup.Catalina的process()方法, 並傳遞參數過去。public void process(String args[])

    Catalina.java的process()做幾件事:
    a: 使用Digester技術裝配tomcat各個容器與組件(server.xml文件加載);
    b: 爲top level的server做初始化工作
    c: 從Server這個容器開始啓動,————轉下一步(二)
    d: 爲Server做一個hook程序,當Server 關閉時,關閉整個Tomact容器
    e: 監聽8005端口,如果發shutdown,關閉8005端口的socket

二、啓動容器

Server(代表整個容器):觸發Server容器中的啓動前、啓動中、啓動後事件,並運行事件處理器。
    Server---->啓動Server的子容器Service(指定提供服務的組件,server.xml中可以配置一個或多個)

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container", 
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
    Service----> 啓動子容器Engine,啓動Connector(每個Service只有一個Engine,可以有多個Connector)

Engine中指定了處理所有Connector接受到的客戶請求的Host主機名。

Connector定義了服務的端口號,負責接受客戶的請求和向客戶返回相應結果。
    Engine----> Host(一個或多個,每個Host表示一個虛擬主機,可以包含一個或多個web應用)

    Host ---->Context(每個Context代表運行在Host上的單個Web應用.)
    StandardContext.start() 這個啓動Context容器的方法被StandardHost調用:

    1、指定Loader,用默認的org.apache.catalina.loader.WebappLoader,Loader就是用來指定這個context會用到哪些類, 哪些jar包。
    2、指定 Manager. 通常使用默認的org.apache.catalina.session. StandardManager 。 Manager是用來管理session的。得到請求後,Request中有一個session屬性。
    3、Binding thread。到了這裏, 就應該發生 class Loader 互換了。 之前是看得見tomcat下面所有的class和lib. 接下來需要看得見當前context下的class。 所以要設置contextClassLoader, 同時還要把舊的ClassLoader記錄下來,因爲以後還要用的。
    4、啓動 Loader. 指定這個Context具體要使用哪些classes, 用到哪些jar文件。 如果reloadable設置成了true, 就會啓動一個線程來監視classes的變化, 如果有變化就重新啓動Context。
    5、啓動logger
    6、觸發Context上的監聽器,作爲監聽器之一,ContextConfig會被啓動. ContextConfig就是用來配置web.xml的。 比如這個Context有多少Servlet, 又有多少Filter, 就是在這裏給Context裝上去的。
        6.1、 defaultConfig. 每個context都得配置 tomcat/conf/web.xml 這個文件。    
        6.2、 applicationConfig 配置自己的 WEB-INF/web.xml 文件
        6.3、 validateSecurityRoles 權限驗證。 通常我們在訪問/admin 或者/manager的時候,需要用戶要麼是admin的要麼是manager的, 才能訪問。 而且我們還可以限制那些資源可以訪問, 而哪些不能。 都是在這裏實現的。
        6.4、 tldScan: 掃描一下, 需要用到哪些標籤(tag lab)
    7、啓動manager
    8、postWelcomeFiles() 我們通常會用到的3個啓動文件的名稱:
        index.html、index.htm、index.jsp 就被默認地綁在了這個context上
    9、 listenerStart 配置listener,初始化Listener
    10、 filterStart 配置 filter,初始化Filter
    11、 啓動帶有<load-on-startup>;1</load-on-startup>;的Servlet.
        順序是從小到大: 1,2,3… 最後是0
        默認情況下, 至少會啓動如下3個的Servlet:
        org.apache.catalina.servlets.DefaultServlet  
        處理靜態資源的Servlet. 什麼圖片啊, html啊, css啊, js啊都找他
        org.apache.catalina.servlets.InvokerServlet
        處理沒有做Servlet Mapping的那些Servlet.
        org.apache.jasper.servlet.JspServlet
        處理JSP文件的.
    12、  標識context已經啓動完畢。

關鍵代碼以後會補上。。




發佈了44 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章