Tomcat源码分析-Bootstrap类

来源:互联网 发布:ubuntu版本的区别 编辑:程序博客网 时间:2024/06/05 05:03

背景

本人真正从事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行代码            ...}

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

委派调用

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

原创粉丝点击