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