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,...