Tomcat筆記(一)
包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的語言性質強制執行了面向對象中組合優于繼承的思想。