個人學習 Spring之控制反轉

2021-08-18 01:28:05 字數 3017 閱讀 3628

spring的作用之一是控制反轉(依賴注入),要說清反轉控制需要依次說清三個問題

1.控制反轉的目的是什麼?

控制反轉的目的是——解耦

2.控制反轉是如何實現的解耦?

沒有控制反轉之前我們實現解耦的乙個重要手段是使用工廠模式

先來看一下工廠模式,我們假設用戶向工廠購買不同的產品,工廠負責生產給使用者,用工廠模式實現的話,**如下:

產品:

// 產品介面

public inte***ce iproduct

// 產品a

public class producta implements iproduct

}// 產品b

public class productb implements iproduct

}

工廠:

//工廠介面

public inte***ce ifactory

// 工廠a

public class factorya implements ifactory

}//工廠b

public class factoryb implements ifactory

}

使用者:

public class user 

}

應該說工廠模式已經很好的實現了解耦,當使用者需要新產品時,無需再修改原有的任何**,只需要新增乙個產品實現類和乙個工廠實現類就可以輕鬆的實現擴充套件。

但是我們可以發現,工廠模式有乙個缺陷:隨著產品種類的增加,我們需要增加同樣多種類的工廠

原因就在於這一段**的耦合造成的:

// 工廠a只能生產產品a

private iproduct product = new producta();

// 工廠b只能生產產品b

private iproduct product = new productb();

我們來設想一下,目前的情況是,工廠的功能已經事先定義好了,使用者需要產品a,只能向a工廠要,需要產品b只能向b工廠要。

那麼能不能由使用者決定工廠的功能,當使用者需要產品a時,就要求工廠生產產品a,當使用者需要產品b時,就要求工廠生產產品b。

這樣我們就只需要乙個工廠實現類,就可以獲得不同種類的產品,而且也無需更改現有**,需要新產品時,只需要寫新的產品實現類就可以了。

也就是說:我們就要求程式實現這樣一種功能

//這裡我們不再規定某個工廠生產某個固定產品,而是在使用者程式模組中,根據需要改變工廠能夠生產的產品種類

private iproduct product;

這就是控制反轉的思想:程式的下游模組可以動態的改變程式上游模組的功能

3.spring如何實現控制反轉?

經常的,我們把控制反轉又叫做依賴注入,在我看來,應該是為了實現控制反轉,而採用了依賴注入的方式

而spring的核心功能之一就是依賴注入。spring實現依賴注入的方式之一是:在工廠和使用者之間加入一層**(即spring容器),用來讀取外部的xml檔案中配置好的工廠型別的名字,並且例項化這個工廠類,存入map中(map),當使用者需要呼叫哪個工廠時,就去這個map中取得對應名稱的哪個工廠例項。

所以本質上,針對不同產品的工廠,還是被例項化了,但是這不需要我們去寫乙個個不同的工廠物件,而是通過外部xml資料注入資料,交由spring容器來實現的。

**解析:

產品:

// 產品介面

public inte***ce iproduct

// 產品a

public class producta implements iproduct

}// 產品b

public class productb implements iproduct

}

工廠:

// 工廠介面

public inte***ce ifactory

// 工廠例項:針對不同的產品,不再新增不同的工廠

public class factory implements ifactory

}

xml檔案:

模擬spring容器:

//bean工廠介面:用來承載不同的工廠型別

public inte***ce ibeanfactory

// bean工廠例項:將所有工廠型別全部例項化到乙個map中

public class beanfactory implements ibeanfactory

@override

public mapgetbean(string name)

}

使用者:

public class user 

}

當我們需要新產品的時候,不需要再新增新的工廠型別例項,只需要實現新的產品例項,然後在xml文件中新增一條產品的配置即可。

這樣的情況可以被描述為:工廠對產品的依賴,不是一開始就寫好的**,而是依靠外部xml中的配置項來動態注入的,這可以被稱為依賴注入

1.工廠模式;

2.xml讀取,jdom或dom4j;

3.class.forname(),呼叫類載入器載入某個類;

4.newinstance(),例項化類載入器載入的類,具有相同功能的還有new關鍵字,注意他們的區別;

spring學習之控制反轉(IOC)

就是負責給我們從容器中獲取指定物件的類。這時候我們獲取物件的 式發 了改變。spring就是 我們的 以前 我們在獲取物件時,都是採 new的 式。是主動的。現在 我們獲取物件時,同時跟 要,有 為我們查詢或者建立物件。是被動的。這種被動接收的 式獲取物件的思想就是 控制反轉,它是spring框架的...

Spring之控制反轉(IOC)

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

Spring學習筆記 1 之IOC 控制反轉

ioc inverse of control,控制反轉,指的是物件的建立權反轉 交給 spring框架,其作用是實現了程式的解耦合 將控制權移交給spring,通過工廠 反射 配置檔案來實現解耦合 bean物件的建立和銷毀兩個屬性配置 spring允許使用者通過depends on屬性顯示指定bea...