Tomcat生命週期的實現

2021-07-24 07:55:15 字數 2799 閱讀 6238

當多個物件存在的時候,物件的建立,物件的銷毀,物件與物件之間關係的維護將是很大的問題,容器的引入,我們將物件的建立,物件關係的維護交給容器,即所謂的控制反轉。而對於物件生命週期的管理也是由容器進行負責,容器怎麼去實現物件生命週期的管理呢?

容器中可能包含很多子容器以及很多元件,tomcat設計思想是入口啟動父容器,而它的子容器和元件是由父容器去啟動的,當所有的元件和子容器都啟動完畢,tomcat也就啟動完成。各個元件和容器都去實現lifecycle介面,那麼就要實現介面裡的方法,我們看看介面裡有哪些方法。

public inte***ce lifecycle

那麼很顯然最重要的也就是start和stop方法。各個元件和容器提供了這些方法的實現,所以它的父元件可以通過這些方法來啟動和停止他們。

並且我們看到,對於生命週期,還存在對於物件生命週期的事件,比如物件建立之前,物件建立,建立之後……即before_start、start、after_start以及物件停止before_stop、stop、after_stop

在這些建立和停止的過程中,我們可以讓某個過程去觸發某個事件,已達到生命週期的管理與監控。所以,我們如果想要乙個元件去觸發事件,需要做到:

①元件需要繫結乙個***

②元件觸發事件

③***處理事件

lifecycleevent類

org.apache.catalina.lifecycleevent表示乙個生命週期事件,下面為該類的內容:

public final class lifecycleevent

extends eventobject

public lifecycleevent(lifecycle lifecycle, string type, object data)

private lifecycle lifecycle = null;

public object getdata()

public lifecycle getlifecycle()

public string gettype()

}

lifecyclelistener介面

表示生命週期的***

public inte***ce lifecyclelistener
lifecyclesupport類

這裡有兩個重要的方法,即:addlifecyclelistener、firelifecycleevent

addlifecyclelistener:新增乙個事件***

firelifecycleevent:激發乙個生命週期的事件

看看firelifecycleevent方法:

public void firelifecycleevent(string type, object data) 

for (int i = 0; i < interested.length; i++)

interested[i].lifecycleevent(event);

}

可以看出當某個元件呼叫firelifecycleevent,這個方法便會呼叫:

interested[i].lifecycleevent(event);這個又是什麼呢?他是註冊在元件上的***的方法,***開始工作,對監聽到的事件進行處理。

lifecyclesupport類儲存所有的生命週期***到乙個陣列中,該陣列為listens,它初始化的時候沒有任何成員。

private lifecyclelistener listeners = newlifecyclelistener[0];

當乙個***通過addlifecyclelistener方法被新增的時候,乙個新的陣列(長度比舊陣列大1)會被建立。然後舊陣列中的元素會被拷貝到新陣列中並把新事件新增到陣列中。當乙個事件被刪除的時候,乙個新的陣列(長度為舊陣列-1)的陣列會被建立並將所有的元素儲存到其中。

firelifecycleevent 方法觸發乙個生命週期事件。首先,它會轉殖整個***陣列,然後它呼叫每個成員的 lifecycleevent 方法,傳遞被觸發的事件。乙個實現了 lifecycle 的元件可以使用 lifecyclesupport 類。例如,該程式的******context 類宣告了如下變數

protected lifecyclesupport lifecycle = newlifecyclesupport(this);

******context 呼叫lifecyclesupport 的 addlifecyclelistener 方法新增乙個

生命週期事件:

public voidaddlifecyclelistener(lifecyclelistener listener) {

lifecycle.addlifecyclelistener(listener);

要刪除乙個生命週期監聽事件,******context 呼叫 lifecyclesupport 類的

removelifecyclelistener 方法。

public voidremovelifecyclelistener(lifecyclelistener listener) {

lifecycle.removelifecyclelistener(listener);

要觸發乙個事件,******context 需要呼叫 lifecyclesupport 的

firelifecycleevent 方法:

lifecycle.firelifecycleevent(start_event,null);

tomcat 的session 生命週期

1.session的建立 建立 request.getsession request.getsession true 第一次呼叫時建立session物件,並在response返回頭中新增 request.getsession,等同於request.getsession true 獲取其jsp或sev...

tomcat架構以及生命週期

當然,這幅圖並沒有勾勒出整體的框架以及他們之間的關係,有另一幅圖表現了這個。最初從bootstrap開始啟動,bootstrap會構造出最重要的3個classloader的層級結構,引導載入catalina這個核心類,並且接受外部的命令。而catalina執行的最重要的任務就是在load方法中用di...

3 TOMCAT學習 TOMCAT的生命週期

tomcat包含很多元件。這些元件需要跟隨tomcat一起啟動和關閉。如何達到這種目的呢?tomcat引入了生命週期的概念。生命周相關的介面和類包括 1.org.apache.catalina.lifecycle 2.org.apache.catalina.lifecyclelistener 3.o...