chj0771 发表于 2017-1-24 08:34:33

tomcat(2)之Catalina.java

这个类位于org.apache.catalina.startup包中.
其实这个类是启动tomcat的真正的入口类.
从Bootstrap.java中看得出来,其实启动时只执行此类的load和start,并设置此对象的父加载器属性。
我们选来看此类的方法load有什么作。
--------------------------------------------------------
public void load(String args[]) {

      try {
            if (arguments(args))
                load();
      } catch (Exception e) {
            e.printStackTrace(System.out);
      }
    }
    注:从方法可以看出,它主要是通过传进来的参数看是否要不要执行load()这个无参的方法。arguments作用就指对不同的参数
    进行属性附值操作,这里start参数是true,因此要执行load();
    我们来看看load的源码:
    -----------------------------------------------------------------------------------------------------------------------
    public void load() {

      long t1 = System.nanoTime(); //返回最准确的可用系统计时器的当前值,以毫微秒为单位。

      initDirs(); //初始化tomcat的目录

      // Before digester - it may be needed

      initNaming();//初始化命名

      // Create and execute our Digester
      Digester digester = createStartDigester();

      InputSource inputSource = null;
      InputStream inputStream = null;
      File file = null;
      try {
            file = configFile();
            inputStream = new FileInputStream(file);
            inputSource = new InputSource("file://" + file.getAbsolutePath()); //加载本置文件conf/server.xml
      } catch (Exception e) {
            ;
      }
      if (inputStream == null) {
            try {
                inputStream = getClass().getClassLoader()
                  .getResourceAsStream(getConfigFile());
                inputSource = new InputSource
                  (getClass().getClassLoader()
                     .getResource(getConfigFile()).toString());
            } catch (Exception e) {
                ;
            }
      }

      // This should be included in catalina.jar
      // Alternative: don't bother with xml, just create it manually.
      if( inputStream==null ) {
            try {
                inputStream = getClass().getClassLoader()
                .getResourceAsStream("server-embed.xml");
                inputSource = new InputSource
                (getClass().getClassLoader()
                        .getResource("server-embed.xml").toString());
            } catch (Exception e) {
                ;
            }
      }
      

      if ((inputStream == null) && (file != null)) {
            log.warn("Can't load server.xml from " + file.getAbsolutePath());
            return;
      }

      try {
            inputSource.setByteStream(inputStream);
            digester.push(this);
            digester.parse(inputSource);
            inputStream.close();
      } catch (Exception e) {
            log.warn("Catalina.start using "
                               + getConfigFile() + ": " , e);
            return;
      }

      // Stream redirection
      initStreams();

      // Start the new server
      if (server instanceof Lifecycle) {
            try {
                server.initialize();
            } catch (LifecycleException e) {
                log.error("Catalina.start", e);
            }
      }

      long t2 = System.nanoTime();
      if(log.isInfoEnabled())
            log.info("Initialization processed in " + ((t2 - t1) / 1000000) + " ms");

    }
   
    我们来一行行的分析上面的为码:
    1)long t1 = System.nanoTime();//返回最准确的可用系统计时器的当前值,以毫微秒为单位。
    此时间主要是用于计算启动的时间,从最后看,只是用于记录进日中用到,
   if(log.isInfoEnabled())
            log.info("Initialization processed in " + ((t2 - t1) / 1000000) + " ms");
            
    2)initDirs();
    初始化目录,也就是把一些目录作为属性写入system属性中,主要是tomcat的一些系统目录,如:
    System.setProperty("catalina.base",
                               catalinaHome);
   System.setProperty("catalina.home", catalinaHome);
   把这些tomcat目录信息写入系统环境变量用,用于后面程序要用到。
   
    3)initNaming();
    也是把一些相关属性写入环境变量中,不过对于作用,目前并不太清楚,如:
   System.setProperty("catalina.useNaming", "false");
   System.getProperty(javax.naming.Context.URL_PKG_PREFIXES);
   System.setProperty(javax.naming.Context.URL_PKG_PREFIXES, value);
   
    4)Digester digester = createStartDigester();
    这个类主要作用就是把配置文件server.xml转换成对象,以便TOMCAT使用和调用。这个类的使用细节有点复杂,目前只知道
    它的作用就是从server.xml中把配置信息加载,并用于初始化server实例,至于初始化的细节要进一步的研究。
    Server是一个接口,位于包:org.apache.catalina
    他的实现类有:StandardServer,StandardService 都位于包:org.apache.catalina.core
    如下:
    public final class StandardServer
    implements Lifecycle, Server, MBeanRegistration
    ---------------------------------------------------------
    public class StandardService
      implements Lifecycle, Service, MBeanRegistration
    可见它们都实现了Lifecycle, Service, MBeanRegistration 三个接口。三个字面意思应为生命周期,服务,Mbean注册器。
   
   
    总结:此类的作用也就是继Bootstrap.java过来,在启动时执行了load()和start();
    load()的作用如下:
    1)返回最准确的可用系统计时器的当前值,以毫微秒为单位。
    2)初始化tomcat目录。
    3)设置一些环境参数,有关于命名的。
    4)得到Digester实例,用于解释server.xml文档,并初化服务器,设置server实例。
    5)设置日志输出和错误输出的地方.
    6)server.initialize(); //服务器进行初始化.
   
    start()的作用如下:
    1)执行server中的start方法:
    ((Lifecycle) server).start();
页: [1]
查看完整版本: tomcat(2)之Catalina.java