tomcat的原理-生命周期lifecycle

之前我們分析了tomcat 的container,我們可以看到tomcat 的Container實現(xiàn)了LifeCycle接口 , LifeCycle 接口提供了tomcat 組件的生命周期方法 ,如果想讓一個系統(tǒng)能夠?qū)ν馓峁┓?wù),我們需要創(chuàng)建、組裝并啟動這些組件;在服務(wù)停止的時候,我們還需要釋放資源,銷毀這些組件;因此LifeCycle接口是對tomcat組件的生命周期的抽象。

先摟一眼lifeCycle接口


image.png
image.png
image.png
image.png
image.png
  1. 以tomcat的尿性, 如果只定義一個接口 , 沒有抽象類,不合適;所有引出了LifeCycleBase ,各組件繼承LifeCycleBase ,LifeCycleBase 基類封裝了組件公用的邏輯. 非公用邏輯子類實現(xiàn)。
    start()為例 :
    a. 組件狀態(tài)的檢查

    image.png

    b. 設(shè)置STARTING_PREP 狀態(tài)
    image.png

    b.1. 先state狀態(tài)容錯檢查
    image.png

    b.2. 發(fā)送生命周期事件
    image.png

    c.抽象方法 , lifeCycleBase 子類實現(xiàn)內(nèi)部啟動
    image.png

    image.png

    image.png

    d. 變更STARTED狀態(tài)
    image.png

    總結(jié) :
    設(shè)計就是要找組件的共同點和不同點 ,共同點統(tǒng)一封裝 ,不同點子類實現(xiàn); 組件的生命周期是一致的 , init->start ->stop ->destroy,然而組件具體的生命周期方法又是由每個組件自己實現(xiàn)。
    tomcat 采用模板方法的方式 統(tǒng)一封裝共性 【組件的state狀態(tài), 狀態(tài)改變發(fā)送生命周期事件】 ,而由子類的xxxInternal()方法去做生命周期方法的具體實現(xiàn)

  2. init()方法為例,在父組件的 init() 方法里需要創(chuàng)建子組件并調(diào)用子組件的 init() 方法,因此調(diào)用者可以無差別的調(diào)用各組件的 init() 方法,這就是組合模式的使用, 只需要調(diào)用頂層的init()方法,整個tomcat 的組件就初始化了。
    代碼以Server頂層組件start()方法為例:

image.png
image.png
image.png

小結(jié):
環(huán)環(huán)相扣, 統(tǒng)一管理組件的生命周期
父子組件, 互相注冊, 你中有我 , 我中有你, 父組件初始 化,必調(diào)用子組件初始化 , 組合模式。
俄羅斯套娃。

  1. 從擴展性來說,代碼需要遵循開閉原則,如果說將來在start()方法中我們需要增加新的邏輯, 難道要修改代碼? tomcat 采用發(fā)布訂閱模式 ,把組件的生命周期定義成一個個狀態(tài),把狀態(tài)的轉(zhuǎn)變看作是一個事件。而事件是有監(jiān)聽器的,在監(jiān)聽器里可以實現(xiàn)一些邏輯 ,我們也成為觀察者模式。
    我們來簡單實現(xiàn)下這個模式:
    定義LifeCycle 接口 ,只有一個addListner() 方法 用于添加監(jiān)聽器 :


    image.png

    定義 LifeCycleListener接口 只有一個 listener() 監(jiān)聽方法 用于監(jiān)聽處理 :


    image.png

    簡單定義一個事件枚舉:
    image.png

寫一個發(fā)布pub 類 實現(xiàn)了LifeCycle 接口 :


image.png

運行結(jié)果 :

image.png

這樣我們就簡單實現(xiàn)了發(fā)布訂閱模式。我們可以通過發(fā)布訂閱模式在組件生命周期的任何時期對代碼進行擴展而不需要修改源代碼。

  1. 我們知道 Container 繼承了 LifeCycle,StandardEngine、StandardHost、StandardContext 和 StandardWrapper 是相應(yīng)容器組件的具體實現(xiàn)類,因為它們都是容器,所以繼承了 ContainerBase 抽象基類,而 ContainerBase 實現(xiàn)了 Container 接口,也繼承了 LifeCycleBase 類,它們的生命周期管理接口和功能接口是分開的,這也符合設(shè)計中接口分離的原則。

總結(jié)

tomcat 對組件生命周期管理采用如下方式:

  1. 接口抽象生命周期方法
  2. 模板方法封裝公用特性
  3. 發(fā)布訂閱模式事件機制對代碼擴展
  4. 容器與容器自間采用組合模式 ,一鍵啟動容器
  5. 抽多個接口 , 類實現(xiàn)多個接口, 接口隔離, 面向接口編程。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容