tomcat源碼學習(1)

 private static Bootstrap daemon = null;

    private static final File catalinaBaseFile;

    private static final File catalinaHomeFile;

    private static final Pattern PATH_PATTERN = Pattern.compile("(\".*?\")|(([^,])*)");

    static {

        // Will always be non-null

        String userDir = System.getProperty("user.dir");

        // Home first

        String home = System.getProperty(Globals.CATALINA_HOME_PROP);

        File homeFile = null;

        if (home != null) {

            File f = new File(home);

            try {

                homeFile = f.getCanonicalFile();

            } catch (IOException ioe) {

                homeFile = f.getAbsoluteFile();

            }

        }

        if (homeFile == null) {

            // First fall-back. See if current directory is a bin directory

            // in a normal Tomcat install

            File bootstrapJar = new File(userDir, "bootstrap.jar");

            if (bootstrapJar.exists()) {

                File f = new File(userDir, "..");

                try {

                    homeFile = f.getCanonicalFile();

                } catch (IOException ioe) {

                    homeFile = f.getAbsoluteFile();

                }

            }

        }

        if (homeFile == null) {

            // Second fall-back. Use current directory

            File f = new File(userDir);

            try {

                homeFile = f.getCanonicalFile();

            } catch (IOException ioe) {

                homeFile = f.getAbsoluteFile();

            }

        }

        catalinaHomeFile = homeFile;

        System.setProperty(

                Globals.CATALINA_HOME_PROP, catalinaHomeFile.getPath());

        // Then base

        String base = System.getProperty(Globals.CATALINA_BASE_PROP);

        if (base == null) {

            catalinaBaseFile = catalinaHomeFile;

        } else {

            File baseFile = new File(base);

            try {

                baseFile = baseFile.getCanonicalFile();

            } catch (IOException ioe) {

                baseFile = baseFile.getAbsoluteFile();

            }

            catalinaBaseFile = baseFile;

        }

        System.setProperty(

                Globals.CATALINA_BASE_PROP, catalinaBaseFile.getPath());

    }

  

上篇關於JVM類加載過程便是學習tomcat源碼學習過程當中學習到的  http://blog.sina.com.cn/s/blog_ae63f79a0102vw94.htmlhtml


咱們查看bootstrap類的源碼,能夠發現,在類加載過程當中,已經嘗試從系統環境變量中獲取 catalina.home和java

catalina.base的值了,若獲取不到則給這兩個變量catalinaBaseFile,catalinaHomeFile賦值當前路徑並建立兩個文件。apache

接下來是main函數的執行,建立Bootstrap對象後,bootstrap先調用成員函數 bootstrap.init(); 在()中調用initClassLoaders中嘗試從conf文件夾下的catalina.properties文件中加載屬性,分別建立三個ClassLoader,即Bootstrap類中的三個成員變量:commonLoader,catalinaLoader和sharedLoader。bootstrap

這裏能夠討論下classloadertomcat

ClassLoader即類加載子系統,負責加載編譯好的.class字節碼文件,並裝入內存,使JVM能夠實例化或以其餘方式使用加載後的類(好比說java很是經常使用的反射)。JVM的類加載子系統支持運行時的動態裝載,動態加載有不少的優勢,例如能夠節省內存空間、靈活地從網絡上加載類,動態加載還有一個好處是能夠經過命名空間的分隔來實現類的隔離,加強了整個系統的安全性。安全

這裏能夠討論下classloader
 
ClassLoader即類加載子系統,負責加載編譯好的.class字節碼文件,並裝入內存,使JVM能夠實例化或以其餘方式使用加載後的類(好比說java很是經常使用的反射)。JVM的類加載子系統支持運行時的動態裝載,動態加載有不少的優勢,例如能夠節省內存空間、靈活地從網絡上加載類,動態加載還有一個好處是能夠經過命名空間的分隔來實現類的隔離,加強了整個系統的安全性。
 
而後利用catalinaLoader動態建立了org.apache.catalina.startup.Catalina的class對象,並建立了該類的一個對象。利用反射調用方法setParentClassLoader 將sharedLoader賦值給類中的成員變量parentClassLoader。將該catalina對象賦值給bootstrap的乘成員變量catalinaDaemon。
 
如下根據main方法傳遞的參數來決定是啓動仍是關閉等等。咱們發現調用了Bootstrap的靜態成員變量daemon(也是Bootstrap的靜態實例),在main方法new出來的bootstrap被賦值給daemon了。調用load函數,load函數中利用反射調用了catalina對象的load方法。catalina的load方法中,在調用start時,直接只調用了load()無參的方法。下篇開講load()方法
相關文章
相關標籤/搜索