tomcat源码学习(1)

系统 1641 0
       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()方法

tomcat源码学习(1)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论