Spring控制反轉 IoC 的理解

2021-07-03 19:40:55 字數 4734 閱讀 4053

spring框架的核心就是控制反轉(inversion of control)和依賴注入(dependency injection),

通過這兩方面來實現松耦合。

一、控制反轉(inversion of control)和依賴注入

使用ioc,物件是被動的接受依賴類,而不是自己主動的去找。

容器在例項化的時候主動將它的依賴類注入給它。

可以這樣理解:控制反轉將類的主動權轉移到介面上,

依賴注入通過xml配置檔案在類例項化時將其依賴類注入。

通過下面的例項來逐步的理解:

首先假設有乙個需求,類business需要呼叫類dependency的方法f(),

按照日常的做法,得到下面的**:

//**類dependency**

public class dependency ;

}//**類business**

public  class business

public void dosth()

}對上述實現做出如下修改:

首先,將business裡的dependency例項的獲得該為setter方式,

其次,將dependency類改為某個介面的實現。

故可以得到下面新的**:

//**介面idependency**

public inte***ce idependency

//**類dependency**

public class dependency ;

}//**類business**

public  class business   // 不生成例項

public void dosth()

public void setdependency(idependency d)

}在新的**中,

首先,business的變數d可以接收任何idependency的例項,

另外,dependency的例項不是通過business來獲得,而是通過setter(也可以用構造器)來由外部傳給它。

這似乎跟我們往常的**沒什麼不同,但這已經是乙個良好的設計。

關鍵就是dependency的例項如何從外部注入給business呢?

這就要通過xml來實現了。

建立乙個springfirst.xml,進行簡單的配置:

這個配置檔案裡將dependency類和business類加入,並將dependency作為business的乙個引數。

單有了這個xml檔案還不夠,還需要乙個測試類來載入該xml檔案,

spring提供了現成的api,在載入上面的xml的時候,

就進行了如下工作:

. 例項化dependency類,例項化business類,

. 並將dependency的例項作為引數賦給了business例項的setdependency()方法。

下面是該測試程式:

public class startserver

}上面的程式載入了xml以後,獲得id為"business"的bean,即business類的例項,並呼叫了其dosth()方法。

由此可見,business的依賴類dependency是通過xml來注入的,而且business是通過介面idependency來接收dependency例項。

因此,當我們又有新的idependency的實現時,只需要修改xml檔案即可,測試程式只需要根據xml裡的id值來獲得需要的引數。

總結上面的例子,對控制反轉和依賴注入已經能理解了。

. 依賴類(dependency)是通過外部(xml)來注入的,而不是由使用它的類(business)來自己製造,這就是依賴的注入。

. 另一方面,business對類dependency的依賴轉移到對介面idependency的依賴,控制權由類轉移到了介面,

即由"實現"轉移到"抽象"中。這就是控制反轉。

二、spring中bean的基本xml配置

在spring容器內拼湊bean叫作裝配。

裝配bean的時候,你是在告訴容器,需要哪些bean,以及容器如何使用依賴注入將它們配合在一起。

理論上,bean裝配可以從任何資源獲得,包括屬性檔案,關聯式資料庫等,

但xml是最常見的spring 應用系統配置源。

spring中的幾種容器都支援使用xml裝配bean,包括:

. xmlbeanfactory ,

基本的xml配置包括如下幾個方面:

1.新增乙個bean

2.設定bean的屬性

2.1 手動設定

2.1.1 通過setter方法

2.1.2 通過構造器

2.2 自動設定

其中bean的屬性即為bean裡的成員變數,這些成員變數值的獲得可以通過setter方法,

例如某個屬性為name,則setter方法為setname(string name);

或者通過構造器在類被例項化時初始化。

setter方法(例如setname方法)或者構造器的呼叫都可以通過在xml檔案裡進行配置,

從而實現讓spring容器來自動進行。

1.新增乙個bean

以下是乙個例子:

id = 「mybean」

class = 「blog.spring.mybean」

singleton = 「false」

init-method = 「initmethod」

destroy-method = 「destroymethod」

autowire = 「autowire type」

/>

下面是對該標籤裡各個屬性的解釋:

. id :      標識該bean的名稱,通過factory.getbean(「id」)來獲得例項。

. class :   該bean的類路徑。

. singleton : 預設為true,即單例項模式,

每次getbean(「id」)時獲取的都是同乙個例項,

如果設定為false,即原型模式,則每次獲取的是新建立的例項。

. init-method : 在bean例項化後要呼叫的方法(bean裡定義好的方法)。

. destroy-method : bean從容器裡刪除之前要呼叫的方法。

. autowire : 其屬性要通過何種方法進行屬性的自動裝配。

對於上述的各個屬性,id和class是必要的,其他的則可以省略。

例如如果設定了autowire的值,則表明需要自動裝配,否則是手動裝配。

2.通過setter方法手動設定bean裡的屬性

bean裡的屬性通過標籤來標識。有以下幾種情況:

. 簡單型別屬性

springtest

. 引用其他bean

也可以將改為

這樣叫做內部bean,缺點是無法在其他地方重用這個bean的例項。

. 裝配集合

共有以下幾種集合的裝配:

****裝配list和陣列****

something

otherthing

****裝配set****

something

otherthing

****裝配map****

value1

****裝配properties****

value1

value2

. 設定null

要將乙個屬性null,需要通過標籤,如果不設定,則屬性為預設值(在例項化時)而不是null。

3.通過構造器手動設定bean裡的屬性

假設有如下乙個bean:

public class mybean

則可以在xml裡這樣配置該bean:

springtest

其中的index是用來標識該引數在建構函式裡的位置的,並從0開始。

4.讓spring完成自動裝配

例如:id = 「mybean」 

class = 「blog.spring.mybean」

autowire = 「autowire type」

/>

下面是幾種autowire type的說明:

. byname : 試圖在容器中尋找和需要自動裝配的屬性名相同的bean或id,如果沒有找到相應的bean,則這個屬性未被裝配上。

. bytype : 試圖在容器中尋找乙個與需要自動裝配的屬性型別相同的bean或id,如果沒有找到,則該屬性未被裝配上。

. constructor : 試圖在容器中尋找與需要自動裝配的bean的構造函式引數一致的乙個或多個bean,如果沒找到則丟擲異常。

. autodetect : 首先嘗試使用constructor來自動裝配,然後再使用bytype方式。

從上面可以看出,如果某個bean不手動設定autowire屬性,則預設為手動裝配。

如果需要將所有bean都設定為自動裝配時,可以通過在標籤中設定default-autowire屬性。

標籤是整個xml文件的根,在它下面就是乙個個的。

其中default-autowire的值也有byname,bytype,constructor,autodetect四種。

例如配置如下:

...自動裝配可能帶來不確定性問題。

例如使用bytype時可能同時發現兩個相同的型別,則不知道該採用哪乙個。

所以可能混合採用自動和手動裝配。

例如,對某個bean設定為自動裝配,而對其某個屬性則手動明確的設定其值,

例如:autowire = 「bytype」

>

通過這樣的配置,對mybean裡的name屬性進行手動裝配,而對除name外的其他屬性就進行自動裝配。

Spring 控制反轉IoC

1,ioc理論背景 在使用物件導向語言開發的系統中,不同物件之間相互協作得以實現業務邏輯。就像是一塊機械手錶,通過不同齒輪的協作,讓時針 分針 秒針精確的執行。如果乙個齒輪發生故障,那麼整塊手錶的功能就要受到影響。手錶齒輪之間的關係和軟體系統中物件的耦合關係很相似。物件之間的耦合關係是必要的,也是無...

Spring之控制反轉(IOC)

目錄 0.面向介面程式設計思想 1.依賴倒置原則與好萊塢原則 2.控制反轉 3.依賴注入 4.spring是如何實現依賴注入的?4.1 beanfactory 4.2 factorybean 面向介面程式設計 不針對實現程式設計,針對超型別程式設計。超型別包括繼承和多型。而依賴倒置原則與好萊塢原則可...

spring框架 IOC控制反轉

spring的核心機制 ioc,通常被稱為控制反轉,是一種設計思想,對於某個具體的物件而言,以前是它控制其他物件,現在是所有物件都被spring控制,所以這叫控制反轉。ioc的乙個重點是在系統執行中,動態的向某個物件提供它所需要的其他物件。這一點是通過di dependency injection,...