Tomcat源碼分析Bootstrap第二章

Bootstrap

靜態類初始化過程:

  • 加載工程目錄路徑
 String userDir = System.getProperty("user.dir")
  • 加載catalina.home目錄
 String home = System.getProperty(Globals.CATALINA_HOME_PROP)

總結、檢查當前是否jvm傳入參數。如果傳入了就將他設置到系統變量中去。

Main啓動過程

  • 創建啓動類的
 Bootstrap bootstrap = new Bootstrap();
  • 執行init方法
bootstrap.init()

org.apache.catalina.startup.Bootstrap#init()

public void init() throws Exception {
        // init project
        initClassLoaders();// //先初始化classLoader,包括common,catalina以及shared

        Thread.currentThread().setContextClassLoader(catalinaLoader); // //設置當前線程classLoader
        SecurityClassLoad.securityClassLoad(catalinaLoader); ////安全classLoader?

        // Load our startup class and call its process() method
        if (log.isDebugEnabled())
            log.debug("Loading startup class");
        //
        Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
        Object startupInstance = startupClass.getConstructor().newInstance();

        // Set the shared extensions class loader
        if (log.isDebugEnabled())
            log.debug("Setting startup class properties");
        String methodName = "setParentClassLoader";
        Class<?> paramTypes[] = new Class[1];
        paramTypes[0] = Class.forName("java.lang.ClassLoader");
        Object paramValues[] = new Object[1];
        paramValues[0] = sharedLoader;
        Method method =
            startupInstance.getClass().getMethod(methodName, paramTypes);
        method.invoke(startupInstance, paramValues);
        catalinaDaemon = startupInstance;
    }

  • 先初始化classLoader
  • 創建Catalina
  • 執行該方法進行賦值操作

started command
start
startd
stop
start

   try {
            String command = "start";
            if (args.length > 0) {
                command = args[args.length - 1];
            }

            if (command.equals("startd")) {
                args[args.length - 1] = "start";
                daemon.load(args);
                daemon.start();
            } else if (command.equals("stopd")) {
                args[args.length - 1] = "stop";
                daemon.stop();
            } else if (command.equals("start")) {
                daemon.setAwait(true);
                daemon.load(args);
                daemon.start();
                if (null == daemon.getServer()) {
                    System.exit(1);
                }
            } else if (command.equals("stop")) {
                daemon.stopServer(args);
            } else if (command.equals("configtest")) {
                daemon.load(args);
                if (null == daemon.getServer()) {
                    System.exit(1);
                }
                System.exit(0);
            } else {
                log.warn("Bootstrap: command \"" + command + "\" does not exist.");
            }

調用Catalina的start() 方法

  public void start()
        throws Exception {
        if( catalinaDaemon==null ) init();

        Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
        method.invoke(catalinaDaemon, (Object [])null);

    }

//TODO

下級分析Catalina類的分析

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