自製IOC容器 1

2021-10-25 16:08:16 字數 3737 閱讀 3223

本系列文章介紹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的元件所生成的物件。

byxcontainercontainer的實現類,實現了基本的元件管理:

public

class

byxcontainer

implements

container

@override

@suppresswarnings

("unchecked"

)public

t getcomponent

(string id)

}

byxcontainer實現了基本的元件管理,使用map儲存idcomponent的對應關係,addcomponent將鍵值對(id, component)插入mapgetcomponent首先從map中獲取id對應的component,然後返回componentcreate方法建立的物件。

有時候,我們希望從不同的地方(如配置檔案、註解)讀取容器配置,並初始化容器,所以需要抽象出乙個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(.

..))

;

在程式使用過程中,如果需要用某個元件,則呼叫containergetcomponent方法,並傳遞對應的id
a 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...