Jetty原始碼分析之AbstractHandler

2021-08-13 19:32:55 字數 2305 閱讀 6636

jetty可以說是乙個基於handler設計的web伺服器,其通過組合各種handler實現對請求的處理。所以原始碼閱讀部分先從handler部分開始,而abstracthandler是大部分handler都繼承了的父類,因此先了解它的原始碼。下面先來看下abstracthandler的類圖,了解下它的繼承關係。

從類圖上就可以看到abstracthandler實現了lifecycle和handler兩個介面,所以同時具備這兩個類的特性。

對於handler介面,其實裡面主要定義了乙個處理請求的handle()方法。

public

inte***ce

handler

extends

lifecycle, destroyable

對於lifecycle介面這裡繼承的是其乙個子類aggregatelifecycle,這個類是定義用來管理集合類的生命週期的,它裡面持有乙個list_beans,可以將一些元件加入到這個list中,如果這些元件實現了lifecycle介面,則aggregatelifecycle統一負責管理它們的生命週期—在aggregatelifecycle啟動的時候啟動這些元件,在aggregatelifecycle停止的時候停止這些元件。下面是其部分原始碼:

private

final list_beans=new copyonwritearraylist();

private

boolean _started=false;

//定義的乙個內部類

private

class

bean

final object _bean;

volatile

boolean _managed=true;

public string tostring()";}

}//會依次啟動管理的所有未啟動的lifecycle元件

@override

protected

void

dostart() throws exception

}// indicate that we are started, so that addbean will start other beans added.

_started=true;

super.dostart();

}//新增乙個元件,並且指定是否被管理,如果不指定為被管理元件,

//則aggregatelifecycle不複雜管理它們的生命週期

public

boolean

addbean(object o, boolean managed)

catch(exception e)}}

return

true;

}

其實分析了上面兩個繼承的父類之後, abstracthandler中基本就分析完了,因為abstracthandler本身沒有對父類的關鍵方法,比如dostart()和dostop()進行重寫,也沒有實現handle()方法(留給具體的子類去實現了),唯一重寫的乙個方法就是setserver()方法。abstracthandler的全部原始碼如下:

public

abstract

class

abstracthandler

extends

aggregatelifecycle

implements

handler

//僅僅是簡單的呼叫父類的dostart(),沒有加任何新邏輯

@override

protected

void

dostart() throws exception

",this);

super.dostart();

}@override

protected

void

dostop() throws exception

",this);

super.dostop();

}//重寫了handler介面中的setserver()方法

public

void

setserver(server server)

public server getserver()

public

void

destroy()

public

void

}

原始碼分析之LayoutInflater

簡介 inflate填充的過程 viewstub,merge,include的載入過程 layoutinflater系統服務的註冊過程 systemserviceregistry類有個靜態 塊,完成了常用服務的註冊,如下 static 註冊am registerservice context.act...

原始碼分析之HashMap

首先hashmap繼承了abstractmap,並且實現了map cloneable和serializable三個介面。cloneable和serializable是比較常規的兩個介面,在這裡並不作為重點。重點將會放在abstractmap和map兩個規範上。其中abstractmap是乙個抽象類,...

原始碼分析之String

先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...