OSGI各個容器之間的類加載器是怎么進行隔離的
什么是osgi:
OSGi為java平台提供了動態模塊化的特性
osgi特點:
沒有對Java的底層實現如類庫和Java虛擬機等進行修改,OSGi實現的模塊間引用與隔離、模塊的動態啟用與停用的關鍵在於它擴展的類加載架構。
OSGi的類加載架構並未遵循Java所推薦的雙親委派模型(Parents Delegation Model),它的類加載器通過嚴謹定義的規則從Bundle的一個子集中加載類。
每一個被正確解析的Bundle都有一個獨立的類加載器支持,這Bundle類加載器:每個Bundle都有自己獨立的類加載器,用於加載本Bundle中的類和資源。當一個Bundle去請求加載另一個Bundle導出的Package中的類時,要把加載請求委派給導出類的那個Bundle的加載器處理,而無法自己去加載其他Bundle的類。些類加載器之間互相協作形成了一個類加載的代理網絡架構,因此OSGi中采用的是網狀的類加載架構,而不是Java傳統的樹狀類加載架構。
osgi中的類加載器:
父類加載器:由Java平台直接提供,最典型的場景包括啟動類加載器(Bootstrap ClassLoader)、擴展類加載器(Extension ClassLoader)和應用程序類加載器(Application ClassLoader),它們用於加載以“java.*”開頭的類以及在父類委派清單中聲明為要委派給父類加載器加載的類。
Bundle類加載器:每個Bundle都有自己獨立的類加載器,用於加載本Bundle中的類和資源。當一個Bundle去請求加載另一個Bundle導出的Package中的類時,要把加載請求委派給導出類的那個Bundle的加載器處理,而無法自己去加載其他Bundle的類。
其他加載器:譬如線程上下文類加載器、框架類加載器等。例如框架類加載器,OSGi框架實現一般會將這個獨立的框架類加載器用於加載框架實現的類和關鍵的服務接口類。它們並非OSGi規范中專門定義的,但是為了實現方便,在許多OSGi框架中都會使用。