Spring之控制反轉(IOC)

2021-09-25 19:29:23 字數 2774 閱讀 3457

目錄

0.面向介面程式設計思想

1.依賴倒置原則與好萊塢原則

2.控制反轉

3.依賴注入

4.spring是如何實現依賴注入的?

4.1 beanfactory

4.2 factorybean

面向介面程式設計:不針對實現程式設計,針對超型別程式設計。超型別包括繼承和多型。而依賴倒置原則與好萊塢原則可以說是思想的具體體現,其表現形式便是控制反轉,注入依賴則是控制反轉的實現方式。其具體關係如下圖1所示:

1.1依賴倒置原則:

1.2好萊塢原則:

在spring中,框架和元件存在雙向的強依賴關係:

一方面,在使用者使用框架時,元件被動地響應框架的呼叫請求,即元件依賴框架。根據依賴倒置原則,應該在兩個模組之間定義乙個元件的抽象介面,高層(框架)呼叫元件抽象介面定義的函式,低層(元件)模組實現該介面,消解了從元件到框架之間的依賴關係。 

另一方面,框架執行時,會主動呼叫元件,即框架依賴元件。根據好萊塢原則,應該在兩個模組之間定義框架中乙個模板方法的抽象介面,高層(框架)呼叫模板方法抽象介面定義的函式,低層(元件)模組實現該介面,消解了從框架到元件之間的依賴關係。

為什麼說是控制反轉了呢?因為不論是依賴倒置原則還是好萊塢原則,最終都是使框架主導一切,框架控制項。也可以這樣說,控制反轉使得過去框架和元件之間雙向的強依賴關係,變成單向的弱依賴關係(框架通過抽象控制項)。

依賴注入是控制反轉的具體實現方式。具體有三種形式:建構函式注入,介面注入和屬性注入。下面我以建構函式注入為例,假設元件a在執行時需要元件b,如果沒有控制反轉的框架,那麼:

這樣我們會發現存在一些問題:

(1). 如果現在要改變 b生成方式,如需要用new b(string name)初始化 b,需要修改 a **;

(2). 如果想測試不同 b物件對 a的影響很困難,因為 b的初始化被寫死在了a的建構函式中;

但是我們如果利用ioc框架,在a的建構函式中注入b,那麼ioc框架會這樣做: 物件a依賴於物件b,當物件 a需要用到物件b的時候,ioc容器就會立即建立乙個物件b送給物件a。ioc容器就是乙個物件製造工廠,你需要什麼,它會給你送去,你直接使用就行了,而再也不用去關心你所用的東西是如何製成的,也不用關心最後是怎麼被銷毀的,這一切全部由ioc容器包辦。如下圖所示:

當我們實現乙個bean之後,我們如何使其與spring框架發生關係,即注入到spring框架?這裡我們不具體講bean的實現方式以及三種注入方式(建構函式注入、介面注入、方法引數注入和介面注入)。

對於前三種注入方式,我們都需要兩步操作(以上面的元件a呼叫b為例):

解析a的xml檔案,將其資訊註冊到spring中;

b在spring中尋找解析好的a的資訊;

第一步解析xml檔案使用了spring原始碼中的beanfactory類,第二步使用了factorybean類。接下來的內容主要分這兩塊來介紹。

beanfactory主要的實現類是xmlbeanfactory。

1、在初始化xmlbeanfactory之前,需要通過classpathresource封裝配置檔案,這樣才能進行後續的資源處理;

2、當配置檔案被封裝為resource之後,resource的載入工作就交給xmlbeandefinitionreader中的reader.loadbeandefinitions(resource)來處理了;

3、doloadbeandefinitions()才是真正的核心處理部分:

3.1、獲取對xml檔案的驗證模式;

3.2、載入xml檔案,並獲得對應的document;

3.3、根據返回的document,解析及註冊bean資訊,即beandefinitions。

這裡我們主要介紹3.3,分為兩塊:解析beandefinitions以及註冊beandefinitions。

3.3.1、解析beandefinitions:

(1)解析id以及name屬性;

(2)進一步解析其他所有屬性並統一封裝至genericbeandefinition型別的例項中;(反射就是在這一步中完成

(3)如果檢測到bean沒有指定beanname,那麼使用預設規則為此bean生成beanname;

(4)將以上資訊封裝到beandefinitionholder例項中。

3.3.2、註冊beandefinitions:

(1)校驗abstractbeandefinition;

(2)對beanname已經註冊的情況的處理;

(3)通過map將beanname與beandefinition一一對應,即註冊beandefinition;

(4)清除解析之前留下的對應的beanname快取。

這裡推薦看下郝佳寫的《spring原始碼深度解析》第五章,講的非常好。

參考:

Spring 控制反轉IoC

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

spring學習之控制反轉(IOC)

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

Spring核心之控制反轉(IoC)

概念 控制反轉 inversion of control,縮寫ioc 是物件導向程式設計中的一種設計原則,可以用來減低計算機 之間的耦合度。其中最常見的方式叫做依賴注入 dependency injection,簡稱di 還有一種方式叫 依賴查詢 dependency lookup 通過控制反轉,物...