本系列文章介紹byxcontainer的實現思路。
byxcontainer是乙個簡單的輕量級ioc容器,具有以下特性:
byxcontainer的設計借鑑了ajoo大神的部落格。碼雲
本篇文章介紹byxcontainer中的核心概念、介面和類。
byxcontainer使用元件(component)來管理系統中的所有物件。元件代表了系統中的乙個物件,並封裝了該物件的建立過程。下面是component
介面的定義:
public
inte***ce
component
假設類a
的定義如下:
public
classa.
..}
如果我們希望按照如下方式建立乙個a
的物件:
a a =
newa
("hello"
,123
);
那麼,可以寫如下component
實現類來把這個建立過程封裝成乙個物件:
public
class
acomponent
implements
component
}
acomponent
封裝了a
物件的建立過程,可以使用以下**來建立這個物件:
a a =
(a)new
acomponent()
.create()
;
那麼,這種方式與前面直接new的方式相比,有什麼優勢呢?主要有兩點:
容器(container)是乙個物件工廠,container
介面的定義如下:
public
inte***ce
container
容器裡面的每個元件都使用id唯一標識。addcomponent
用於向容器中註冊元件,註冊時需要給出元件的id和定義。getcomponent
用於從容器中獲取指定id的元件所生成的物件。
byxcontainer
是container
的實現類,實現了基本的元件管理:
public
class
byxcontainer
implements
container
@override
@suppresswarnings
("unchecked"
)public
t getcomponent
(string id)
}
byxcontainer
實現了基本的元件管理,使用map
儲存id
與component
的對應關係,addcomponent
將鍵值對(id, component)
插入map
,getcomponent
首先從map
中獲取id
對應的component
,然後返回component
的create
方法建立的物件。
有時候,我們希望從不同的地方(如配置檔案、註解)讀取容器配置,並初始化容器,所以需要抽象出乙個containe***ctory
介面:
public
inte***ce
containe***ctory
byxcontainer中已經實現了乙個jsoncontaine***ctory
用於從json檔案中讀取容器配置。使用者可以按照如下方式使用byxcontainer:
// 初始化容器
inputstream inputstream = thread.
currentthread()
.getcontextclassloader()
.getresourceasstream
("container.json");
containe***ctory factory =
newjsoncontaine***ctory
(inputstream)
;container container = factory.
create()
;// 使用容器
sometype myobject = container.
getcomponent
("myobject"
);
在接下來的文章中不會介紹與配置檔案解析有關的內容,而只會介紹支援將配置檔案翻譯成byxcontainer元件定義的基礎設施。
實際上,有了上面介紹的這幾個介面和類,我們就能把這個ioc容器用起來了,具體使用步驟如下:
為每乙個希望被ioc容器管理的物件都實現乙個component
子類,封裝該物件的建立細節
public
class
acomponent
implements
component
public
class
bcomponent
implements
component
public
class
ccomponent
implements
component
在程式初始化**中,建立乙個byxcontainer
,使用addcomponent
註冊所有元件container container =
newbyxcontainer()
;container.
addcomponent
("c1"
,new
acomponent(.
..))
;container.
addcomponent
("c2"
,new
bcomponent(.
..))
;container.
addcomponent
("c3"
,new
ccomponent(.
..))
;
在程式使用過程中,如果需要用某個元件,則呼叫container
的getcomponent
方法,並傳遞對應的ida a = container.
getcomponent
("c1");
b b = container.
getcomponent
("c2");
c c = container.
getcomponent
("c3"
);
這樣使用雖然能完成需求,但是非常不方便,因為對每個不同的物件,都需要建立乙個不同的實現類。有沒有一種方法,能夠無需實現任何子類就能定義不同物件的建立方式呢?
自製IOC容器 4
本系列文章介紹byxcontainer的實現思路。byxcontainer是乙個簡單的輕量級ioc容器,具有以下特性 byxcontainer的設計借鑑了ajoo大神的部落格。碼雲 本篇文章介紹byxcontainer中的條件元件。假設現在有乙個mydao介面,以及它的兩個實現類 public in...
IOC容器簡介
了解到spring框架的兩大核心模組 ioc容器和aop 原始碼分析首先從ioc容器開始,之後再來看aop 這一篇我們先來了解一下什麼是ioc容器,以及ioc容器的功能 1 正常開發模式 非依賴反轉 正常的,合作物件的引用或依賴關係的管理由具體物件來完成 持有被引用的物件 這導致了 高度耦合並且降低...
手寫IOC容器
ioc原理簡述 所謂ioc,對於spring框架來說,就是由spring負責控制物件的生命週期和物件間的關係。說白了也就是我們在建立物件時,由原先的程式設計師建立物件反轉為由容器控制這些操作,在bean工廠中建立物件,程式設計師只需要在使用某個物件時直接從容器中獲取。1 配置需要容器進行管理的bea...