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的内容

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