包org.apache.catalina主要由接口組成。我們可以把這些接口分為幾個(gè)大類。
第一類接口主要是對web application及其各個(gè)組成部分的抽象。這些接口以Container為父接口,分別為Context,Engine,Host,Wrapper。
Engine代表的是整個(gè)Catalina Servlet引擎。
Host代表的是Catalina Servlet引擎中的一個(gè)虛擬主機(jī)。
Context
Wrapper代表的是某一個(gè)具體的servlet
下面我從Container的抽象實(shí)現(xiàn)ContainerBase來切入Container,Context,Engine,Host,Wrapper的實(shí)現(xiàn)。
由于Container接口是web application中各部分的抽象的公共部分,因此其實(shí)現(xiàn)類ContrainerBase是一個(gè)抽象類。對于Container接口的各個(gè)子接口的實(shí)現(xiàn)類,則通過繼承ContainerBase來實(shí)現(xiàn)接口Container接口。例如Engine接口繼承Container接口,Engine的實(shí)現(xiàn)類StandardEnginer繼承ContainerBase類。
ContainerBase實(shí)現(xiàn)得接口有Container,Lifecycle,MBeanRegistration, Pipeline,Serializable。其中Lifecycle,Pipeline和Container屬于同一個(gè)包。
Lifecycle接口定義了一個(gè)具有生命期屬性的組件所必須提供的方法:start(啟動(dòng)一個(gè)組件),stop(停止一個(gè)組件);除此之外該接口還定義了與具有生命期屬性的組件的Listener相關(guān)的3個(gè)方法,用來添加、刪除、查找對該組件的生命期階段變化感興趣的Listener。
Pipeline在Tomcat中是一個(gè)或者多個(gè)Value的組合,Value用來對Request進(jìn)行處理,生成Response或者將Request和Response傳給下一個(gè)Value進(jìn)行處理。Tomcat并沒有象通常一樣將Pipeline和Value作為同一個(gè)接口,即使用Composite模式,而是Pipeline和Value分別作為集合和元素,Pipeline只能加入Value而不能加入Pipeline,Value則不能包含任何子Value。
ContainerBase對lifecycle接口的實(shí)現(xiàn)分為兩類,addLifecycleListener、findLifecycleListener、removeLifecycleListener都是通過調(diào)用ContainerBase的一個(gè)LifecycleSupport成員實(shí)現(xiàn);start和stop方法則為ContainerBase自己實(shí)現(xiàn)。我一開始以為LifecycleSupport也實(shí)現(xiàn)了lifecycle接口,但實(shí)際上并不是這樣,原因是start和stop方法與具體的組件密切相關(guān)。此外LifecycleSupport中還包括一個(gè)名為fireLifecycleEvent的方法,該方法遍歷所有的LifeCycleListener,并觸發(fā)Lifecycle事件??傮w上看LifecycleSupport實(shí)現(xiàn)了所有實(shí)現(xiàn)Lifecycle接口的組件的公共部分,維護(hù)一個(gè)LifecycleListener的數(shù)組,提供了添加、修改、獲取LifecycleListener和觸發(fā)各個(gè)Listener的方法。一個(gè)有趣的情況是,LifecycleSupport是一個(gè)final類,無法被繼承,利用java的語言性質(zhì)強(qiáng)制執(zhí)行了面向?qū)ο笾薪M合優(yōu)于繼承的思想。