回顧Tomcat處理請求
下圖是對于Tomcat處理請求內部的流轉過程.也描述了Tomcat組件的靜態關系.
image
如果讓一個系統能夠對外提供服務,需要創建,組裝并啟動這些組件,在停止的時候,需要釋放資源,銷毀組件,這個過程都是動態的,所以Tomcat需要動態管理這些組件的生命周期.
Tomcat的LifeCycle接口
在Tomcat的啟動過程中,每個組件都要經歷創建
,初始化
,啟動
這幾個過程,而這幾個狀態的轉變都是固定的,但是具體組件的初始化邏輯和啟動方式都不一樣,所以Tomcat把組件的生命周期方法抽象到LifeCycle
接口,讓每個具體的組件去實現接口的方法.
image
可以看到紅框內的方法就是對組件生命周期的抽象
LifeCycle的監聽事件
為了解耦組件,所以LifeCycle中的方法都是由父組件進行調用,如果要對子組件新增邏輯,就需要用到組件的狀態監聽.
這里用到了觀察者模式.上圖中的
Listener
相關方法就是監聽組件狀態變化的方法.LifecycleStats
枚舉類定義了組件的所有狀態
LifeState定義的組件狀態
LifeCycle依賴關系
在LifeCycle
依賴關系中,可以看到有一個實現類LifeCycleBase
,實現了LifeCycle
接口的所有方法,定義了相應的抽象方法交給子類實現,這是經典的模板設計
模式.
LifeCycleBase的init方法
LifeCycleBase#init
可以看到初始化方法是synchronized
修飾的,證明不能多線程進行組件的創建.
- 1.檢查狀態
- 2.修改狀態,觸發
INITIALIZING
事件監聽
狀態變化會通知所有的觀察者
- 3.調用子類的初始化方法
- 4.修改狀態,觸發
INITIALIZED
事件監聽
組件監聽器注冊方法
- Tomcat自定義的監聽器,這些監聽器是父組件在創建子組件的過程中注冊到子組件的.例如MemoryLeakTracingListener,用來檢測Context容器中的內存泄漏,這個監聽器在Host容器創建Context容器時注冊到Context中的.
具體位置在StandardHost#addChild方法
- 在server.xml定義監聽器,Tomcat在啟動時會解析server.xml,創建監聽器并注冊到容器組件.
ContainerBase的公共邏輯
- 1.容器的創建/初始化/銷毀
- 2.容器添加/刪除子容器