tomcat解析(二)Bootstrap.init

org.apache.catalina.startup.Bootstrap沒有靜態塊,因此將直接運行其main方法的,main方法如下:

有趣的是,其註釋裏寫着used for testing only,但實際上卻的確是從這裏啓動的(起碼我認爲是,有其它高見請盡情留言於我):)

main方法的內容很清晰,實例化了一個Bootstrap對象,並依次調用其init、load及start方法.本文將只講述init()方法:),方法內容如下:

該方法調用了幾位方法完全服務器的初步初始化,setCatalinaHome()及setCatalinaBase()方法就不說了,根據名字應該可以看得出來是設置catalina.home及catalina.base兩個變量的,是調用System.setProperty方法設置到系統變量中,init裏其它主要的內容包括以下三個方面

1.initClassLoaders ,初始化類加載器
  該方法用於實例化3個ClassLoader對象commonLoader、catalinaLoader及sharedLoader,實例化時用的是如下代碼:

createClassLoader如下

    String value = CatalinaProperties.getProperty(name + ".loader");
    CatalinaProperties的getProperty是靜態方法,是從CatalinaProperties持有的properties對象中取值,而該類有一個靜態塊,即是用於初始化該properties對象,靜態塊代碼如下:

其中getConfigUrl()方法如下
    /**
     * Get the value of the configuration URL.
     */
    private static String getConfigUrl() {
        return System.getProperty("catalina.config");
    }
可看出表態塊loadProperties用於依次獲取catalina.config變量所設置的配置文件、catalina.base變量路徑中的catalina.properties及
/org/apache/catalina/startup/catalina.properties來初始化其Properties對象(前者取不到才使用後者),
並且將該對象的每一個屬性也設置到系統屬性中,
catalina.properties中有效的配置如下
 
在創建commonLoader時所用代碼
String value = CatalinaProperties.getProperty(name + ".loader");
將取到如下字符串
${catalina.home}/lib,${catalina.home}/lib/*.jar,在將{catalina.home}轉化爲真正代表文件路徑的路徑字符串後調用URLClassLoader類的構造方法實例化commonClassLoader,緊接着使用下列語句生成MBeanServer對象mBeanServer,這部分內容是JMX的東東,有興趣的同學可以深入研究,這裏就不多講了mBeanServer = MBeanServerFactory.createMBeanServer();並且將commonClassLoader以Catalina:type=ServerClassLoader,name=common的ObjectName對象註冊到該MBean服務器中,而實例化catalinaLoader及sharedLoader時因server.loader及shared.loader沒有設置屬性值,
且以commonLoader爲父節點,所以最終這兩個變量與commonLoader變量將指向同一個對象,catalinaLoader及sharedLoader則分別以
Catalina:type=ServerClassLoader,name=server及Catalina:type=ServerClassLoader,name=shared進行註冊

2.實例化org.apache.catalina.startup.Catalina對象

實例化org.apache.catalina.startup.Catalina對象,然後調用其setParentClassLoader方法,參數爲sharedLoader,在實例化Catalina對象的時候,會調用其父類Embedded的構造方法,其中的setSecurityProtection方法包含了從catalina.properties讀取package.definition及package.access來設置java包的安全訪問權限

3.讓catalinaDaemon引用startupInstance
  如第2點所言,startupInstance爲org.apache.catalina.startup.Catalina的實例對象

 

至此Bootstrap的init方法執行完成,下一章再講Bootstrap.load及start的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章