天天看點

SpringIOC控制反轉

在Spring中,依賴注入(DI)模式實作了控制反轉(IoC)原理。讓我們通過一個例子來幫助了解依賴注入。我們先看到java版的例子,然後在此基礎上加上spring的功能。就例子而言,是相當地簡單。QuizMater接口暴露了popQuestion()方法。為了保持簡單性,QuizMaster将隻生成一個問題。

StrutsQuizMaster和SpringQuizMaster類實作了QuizMaster接口,它們各自生成struts和spring相關的問題。

<code></code>

<code>有個QuizMasterService類向使用者顯示問題。QuizMasterService類關聯了QuizMaster接口。</code>

最後建立QuizProgram類來管理測驗。

看上去相當的簡單,我們建立了QuizMasterService類的執行個體,并且調用了askQuestion()方法。當你執行program,期望的“Are you new to Spring?”将從控制台列印出來。

 再看看這個例子的類圖。綠色箭頭表示泛化,藍色箭頭表示關聯。

SpringIOC控制反轉

看的出來這種結構是緊密耦合在一起的。在QuizMasterService類中建立了QuizMaster的執行個體,如下所示。

<code></code>為了測驗精通struts的人,我們需要修改QuizMasterService成這樣:

是以耦合性是非常高的,這就是為什麼要使用依賴注入來避免這種耦合。Spring架構提供了非常強大的容器來管理元件。容器就是基于控制反轉(IoC)理念并且實作了依賴注入。這些元件僅僅需要選擇一種接受資源的方式,容器會自動為元件推送資源。

下面我們替換為QuizMasterService類直接建立QuizMaster對象的方式,讓容器來承擔這項工作。替換了寫死,允許容器來注入需要的依賴項。

注入依賴使用setter或構造方法注入。下面看看怎樣使用setter來注入。

QuizMaster的值使用setQuizMaster()方法設定。在QuizMasterService類中,QuizMaster對象沒有執行個體化,但仍然來通路它。通常這樣做會抛出NullPointerException異常,但是容器已經執行個體化了這個對象,是以能很好的工作。

再作了這些改變之後,例子的類圖就變成這樣了。

SpringIOC控制反轉

再看看這個例子的類圖。綠色箭頭表示泛化,藍色箭頭表示關聯。

 圖中多了容器,它幫助注入依賴項。

在beans.xml檔案中的beans配置:

定義每個bean使用bean标簽。bean标簽的id屬性是擷取這個bean的邏輯名,class屬性表示了真實的bean類。property标簽指向bean的屬性。使用setter注入一個bean需要使用ref标簽。

SpringQuizMaster的引用被注入到QuizMasterbean。當我們執行這個例子,控制台列印出“Are you new to Spring?”。

為了使QuizMaster問一個struts相關的問題,僅僅需要改變ref标簽的指向。

依賴注入降低了元件之間的耦合。

繼續閱讀