自製IOC容器 4

2021-10-19 10:44:05 字數 3461 閱讀 5930

本系列文章介紹byxcontainer的實現思路。

byxcontainer是乙個簡單的輕量級ioc容器,具有以下特性:

byxcontainer的設計借鑑了ajoo大神的部落格。碼雲

本篇文章介紹byxcontainer中的條件元件。

假設現在有乙個mydao介面,以及它的兩個實現類:

public

inte***ce

mydao

public

class

mydaoimpl1

implements

mydao

public

class

mydaoimpl2

implements

mydao

這裡還有乙個myservice類,它需要使用乙個mydao,所以需要通過建構函式傳進來:

public

class

myservice..

.}

那麼,應該如何建立乙個myservice物件呢?顯然,可以使用下面兩種方式之一:

myservice myservice =

newmyservice

(new

mydaoimpl1()

);

myservice myservice =

newmyservice

(new

mydaoimpl2()

);

假設現在需要根據某個標誌位「動態地」決定應該用哪種方式來建立myservice物件,類似下面這樣:

boolean flag =..

.;myservice myservice;

if(flag)

myservice =

newmyservice

(new

mydaoimpl1()

);else

myservice =

newmyservice

(new

mydaoimpl2()

);

當然,這些邏輯最好不要直接寫在**裡,因為這樣會導致頻繁修改**和重新編譯(當標誌位條件改變時)。所以,我們考慮使用ioc容器來解決這個問題。

根據上面的描述,可以知道,byxcontainer需要支援根據某個條件建立不同元件的功能,conditioncomponent就是用來完成這項功能的:

public

class

conditioncomponent

implements

component

@override

public object create()

}public

inte***ce

component

}

conditioncomponent包含三個子元件:predicatec1c2,表示的邏輯是:如果predicate建立的物件為boolean型別並且值為true,則返回c1建立的物件,否則返回c2建立的物件。

有了conditioncomponent,上面的需求就可以這樣來實現:

component flag =

value

(true);

component myservice =

condition

( flag,

constructor

(myservice.

class

,constructor

(mydaoimpl1.

class))

,constructor

(myservice.

class

,constructor

(mydaoimpl2.

class))

);

或者這樣:

component flag =

value

(true);

component mydao =

condition

( flag,

constructor

(mydaoimpl1.

class),

constructor

(mydaoimpl2.

class))

;component myservice =

constructor

(myservice.

class

, mydao)

;

flag也可以是乙個更複雜的元件定義,例如判斷某個標誌字串是否是某個特定值:

component database =

value

("***");

component flag =

instancefactory

(database,

"equals"

,value

("mysql"))

;component mydao =

condition

( flag,

constructor

(mydaoimpl1.

class),

constructor

(mydaoimpl2.

class))

;component myservice =

constructor

(myservice.

class

, mydao)

;

等價於以下邏輯:

string database =

"***"

;boolean flag = database.

equals

("mysql");

mydao mydao = flag ?

newmydaoimpl1()

:new

mydaoimpl2()

;myservice myservice =

newmyservice

(mydao)

;

這些配置都可以寫在配置檔案中,然後讓byxcontainer讀取配置檔案來初始化容器,這樣就可以在不修改**的情況下動態改變myservice的建立過程。

自製IOC容器 1

本系列文章介紹byxcontainer的實現思路。byxcontainer是乙個簡單的輕量級ioc容器,具有以下特性 byxcontainer的設計借鑑了ajoo大神的部落格。碼雲 本篇文章介紹byxcontainer中的核心概念 介面和類。byxcontainer使用元件 component 來管...

IOC容器簡介

了解到spring框架的兩大核心模組 ioc容器和aop 原始碼分析首先從ioc容器開始,之後再來看aop 這一篇我們先來了解一下什麼是ioc容器,以及ioc容器的功能 1 正常開發模式 非依賴反轉 正常的,合作物件的引用或依賴關係的管理由具體物件來完成 持有被引用的物件 這導致了 高度耦合並且降低...

手寫IOC容器

ioc原理簡述 所謂ioc,對於spring框架來說,就是由spring負責控制物件的生命週期和物件間的關係。說白了也就是我們在建立物件時,由原先的程式設計師建立物件反轉為由容器控制這些操作,在bean工廠中建立物件,程式設計師只需要在使用某個物件時直接從容器中獲取。1 配置需要容器進行管理的bea...