本系列文章介紹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
包含三個子元件:predicate
、c1
和c2
,表示的邏輯是:如果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...