Tomcat源码分析-Bootstrap类

背景

本人真正从事Java开发工作已经五年了,最近一直在思考五年的工作经历,技术应该达到一个什么样的水平的呢。运用SWOT方法,剖析了一下自己目前的现状:

1 能快速熟悉一个项目,厘清项目框架、主要功能模块,找到值得学习的设计思想,发现明显的设计缺陷。 
2 有代码洁癖,看到烂代码就有重构的冲动,深受代码重构、代码简洁之道等Java经典著作的毒,写代码的时候简直会有“我是作家,我的代码我做主”的错觉。 
3 Java基础扎实,有知其所以然的功底,对未知的知识也有探究其所以然的能力 
4 搭个小项目基础框架,研究下新技术,小打小闹没问题

总的来说,是一个熟练的Java编程人员,但是缺乏大型项目的经验,也没用Java做过高科技含量的东西,着实是一种遗憾。不知怎么就想到了架构层面上,想提升下自己架构设计方面的素养,所以就想到再透透地研究下Tomcat,看看能不能从中学到架构层面的东西。(ps:2014年研究过Tomcat,不过现在已经忘记得差不多了)

Bootstrap类

Bootstrap类的main方法是整个Tomcat项目的入口,梳理一下就会发现,其实这个类的代码很少,也很清晰,它就是一个大Boss,指挥它的小兵Catalina类的实例完成各种操作。

类图:

这里写图片描述

main方法的流程图

这里写图片描述

代码启示录

实际代码不到500行的Bootstrap类里面,我看出的一点点东西:

catch的高明用法

try {

        } catch (Throwable t) {
            // Unwrap the Exception for clearer error reporting
            if (t instanceof InvocationTargetException &&
                    t.getCause() != null) {
                t = t.getCause();
            }
            handleThrowable(t);
            t.printStackTrace();
            System.exit(1);
        }

catch的异常类型都是Throwable,这个是顶级的异常类,能捕获包括Error在内的异常,所以比我们常用的catch Exception的涵盖的更广泛一些。另外,用System.exit(1)代表异常退出,让我这个从没有调用过这个方法的Coder惊叹不已。

类加载器

Bootstrap类有三个成员变量,分别指向三个类加载器:common,catalina,shared,但是源码跟踪下来,发现这三个类加载器其实就是common一个,创建是通过读取conf目录下的catalina.properties的属性来创建的。而默认配置文件catalina和shared的值都是空。

catalina.properties关于类加载器配置如下:

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"
server.loader=
shared.loader=

类加载器创建代码:

private void initClassLoaders() {
        try {
            commonLoader = createClassLoader("common", null);
            if( commonLoader == null ) {
                // no config file, default to this loader - we might be in a 'single' env.
                commonLoader=this.getClass().getClassLoader();
            }
            catalinaLoader = createClassLoader("server", commonLoader);
            sharedLoader = createClassLoader("shared", commonLoader);
        } catch (Throwable t) {
            handleThrowable(t);
            log.error("Class loader creation threw exception", t);
            System.exit(1);
        }
    }

 private ClassLoader createClassLoader(String name, ClassLoader parent)
        throws Exception {

        String value = CatalinaProperties.getProperty(name + ".loader");
        if ((value == null) || (value.equals("")))
            return parent;
            //此处略去N行代码
            ...

}

atalina和shared都是以common为父类,且配置属性值都为空,因此这三个引用都是指向commonClassLoader的。

委派调用

实在是没看出来这里用了什么设计模式:不像代理模式,但是又的确是委派调用Bootstrap类的一个引用对象Catalina实例来执行各个方法的。 
这种设计方法我在iBatis源码中也见过,SqlMapClient和另一个Executor后缀的类(具体类名称忘记了),二者定义的方法大致类似,但真正干活的趋势Executor类。难道大师级的人物都偏爱这种设计方法?以我世俗的眼光看来,干嘛非得多一级调用呢,直接用Catalina类作为主类不行吗? 
不过,似乎还是能领略到一点巧妙之处的:直接委派调用代码相当简洁,Bootstrap类也实至名归,就是启动类,控制中心。

 

https://blog.csdn.net/wojiushiwo945you/article/details/72846664

posted @ 2018-05-03 21:47  dion至君  阅读(100)  评论(0编辑  收藏  举报