包org.apache.catalina主要由接口组成。我们可以把这些接口分为几个大类。
第一类接口主要是对web application及其各个组成部分的抽象。这些接口以Container为父接口,分别为Context,Engine,Host,Wrapper。
Engine代表的是整个Catalina Servlet引擎。
Host代表的是Catalina Servlet引擎中的一个虚拟主机。
Context
Wrapper代表的是某一个具体的servlet
下面我从Container的抽象实现ContainerBase来切入Container,Context,Engine,Host,Wrapper的实现。
由于Container接口是web application中各部分的抽象的公共部分,因此其实现类ContrainerBase是一个抽象类。对于Container接口的各个子接口的实现类,则通过继承ContainerBase来实现接口Container接口。例如Engine接口继承Container接口,Engine的实现类StandardEnginer继承ContainerBase类。
ContainerBase实现得接口有Container,Lifecycle,MBeanRegistration, Pipeline,Serializable。其中Lifecycle,Pipeline和Container属于同一个包。
Lifecycle接口定义了一个具有生命期属性的组件所必须提供的方法:start(启动一个组件),stop(停止一个组件);除此之外该接口还定义了与具有生命期属性的组件的Listener相关的3个方法,用来添加、删除、查找对该组件的生命期阶段变化感兴趣的Listener。
Pipeline在Tomcat中是一个或者多个Value的组合,Value用来对Request进行处理,生成Response或者将Request和Response传给下一个Value进行处理。Tomcat并没有象通常一样将Pipeline和Value作为同一个接口,即使用Composite模式,而是Pipeline和Value分别作为集合和元素,Pipeline只能加入Value而不能加入Pipeline,Value则不能包含任何子Value。
ContainerBase对lifecycle接口的实现分为两类,addLifecycleListener、findLifecycleListener、removeLifecycleListener都是通过调用ContainerBase的一个LifecycleSupport成员实现;start和stop方法则为ContainerBase自己实现。我一开始以为LifecycleSupport也实现了lifecycle接口,但实际上并不是这样,原因是start和stop方法与具体的组件密切相关。此外LifecycleSupport中还包括一个名为fireLifecycleEvent的方法,该方法遍历所有的LifeCycleListener,并触发Lifecycle事件。总体上看LifecycleSupport实现了所有实现Lifecycle接口的组件的公共部分,维护一个LifecycleListener的数组,提供了添加、修改、获取LifecycleListener和触发各个Listener的方法。一个有趣的情况是,LifecycleSupport是一个final类,无法被继承,利用java的语言性质强制执行了面向对象中组合优于继承的思想。