天天看點

JIOPi v0.2類加載模型

JIOPi v0.2的類加載模型在延續JIOPi v0.1 POJO相容的基礎上,增加了對 JIOPi 藍圖 的支援。

JIOPi v0.1類加載模型參見 http://jiopi.iteye.com/blog/656895

藍圖的類加載規則:

JIOPi藍圖由以下Jar包組成:

目前藍圖的Jar包

依賴藍圖的Jar包

是以藍圖子產品的類加載器必須将藍圖子產品中的Jar進行分類,首先從目前藍圖的Jar包中加載類,如果加載不到,則應當調用依賴藍圖的Jar包所使用的藍圖子產品的類加載器進行藍圖的加載,而不應該使用目前類加載器進行類的加載。

特殊加載邏輯:如果能夠從目前藍圖的Jar包中加載到類,則應當檢測ContextClassLoader中是否存在同名、同版本的藍圖,如果存在,則應當從ContextClassLoader中加載類,而不使用目前類加載器加載,進而保證實作子產品的對象可以暴漏到ContextClassLoader加載的類中。

子產品的類加載規則

子產品由以下Jar包組成:

目前子產品的實作類Jar包

目前子產品的依賴藍圖Jar包

其他第三方類庫Jar包

對于目前子產品的實作類Jar包 和 其他第三方類庫的Jar包中的類,由目前子產品的類加載器進行加載,而子產品所依賴的藍圖Jar中的類,則應該交由對應的藍圖的類加載器進行加載

藍圖的版本沖突

在大多數情況下,總是一個子產品通過藍圖使用另一個子產品,而這兩個子產品必然使用了同一個版本的藍圖,然而在下面這種情形下,會出現藍圖的版本沖突:

Aimpl-1.0.0.0子產品 實作A1.0藍圖, 依賴 B-1.0藍圖,選擇使用了 Bimpl-1.0.0.0的實作子產品,Cimpl-1.0.0.0 依賴 A1.0,B-1.1,然而傳遞給Cimpl-1.0.0.0 的 B接口的實作類,有的是從 BNimpl-1.1.0.0 獲得的,有的是從A1.0中擷取的,而從A1.0中擷取的确是B1.0的實作類,進而B藍圖的兩個版本在 Cimpl-1.0.0.0中産生了版本沖突,當然,這個異常模型是不會出現在傳統Java運作環境的,因為不可能出現一個類的兩個版本,而這種情形卻會出現在JIOPi的子產品依賴模型中,并且JIOPi打算賦予Cimpl-1.0.0.0處理 B 藍圖不同版本的實作的能力,這個能力計劃通過動态代理類來完成,進而避免強制類型轉換異常。不過該規範沒有被包含在JIOPi v0.2中,是以在使用JIOPi v0.2規範的實作容器時,要注意避免将同一藍圖的不同版本的實作類的對象在同一個子產品中會合這種情形。