zoukankan      html  css  js  c++  java
  • 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.html


    我们查看bootstrap类的源码,可以发现,在类加载过程中,已经尝试从系统环境变量中获取 catalina.home和

    catalina.base的值了,若获取不到则给这两个变量catalinaBaseFile,catalinaHomeFile赋值当前路径并创建两个文件。

    接下来是main函数的执行,创建Bootstrap对象后,bootstrap先调用成员函数 bootstrap.init(); 在()中调用initClassLoaders中尝试从conf文件夹下的catalina.properties文件中加载属性,分别创建三个ClassLoader,即Bootstrap类中的三个成员变量:commonLoader,catalinaLoader和sharedLoader。

    这里可以讨论下classloader

    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()方法
  • 相关阅读:
    C语言高效编程的几招
    部分功能函数命名总结(补充中)
    Linux的多线程编程的高效开发经验
    生成PDF下载 HTTP或FTP远程获取PDF
    .dnn文件 xml 配置
    有身体 有钱 还要有什么能进太空?
    dnn 4.8.2 RegisterStartupScript 函数失效 解决方案
    字符串 分隔符 逗号行吗? JAVASCRIPT 函数参数中有单双引号
    2007年的最后一天,最后一个小时。
    标题中有单引号',怎么查询?
  • 原文地址:https://www.cnblogs.com/vikeria/p/4374954.html
Copyright © 2011-2022 走看看