目錄
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.3,分為兩塊:解析beandefinitions以及註冊beandefinitions。3.2、載入xml檔案,並獲得對應的document;
3.3、根據返回的document,解析及註冊bean資訊,即beandefinitions。
3.3.1、解析beandefinitions:這裡推薦看下郝佳寫的《spring原始碼深度解析》第五章,講的非常好。(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 控制反轉IoC
1,ioc理論背景 在使用物件導向語言開發的系統中,不同物件之間相互協作得以實現業務邏輯。就像是一塊機械手錶,通過不同齒輪的協作,讓時針 分針 秒針精確的執行。如果乙個齒輪發生故障,那麼整塊手錶的功能就要受到影響。手錶齒輪之間的關係和軟體系統中物件的耦合關係很相似。物件之間的耦合關係是必要的,也是無...
spring學習之控制反轉(IOC)
就是負責給我們從容器中獲取指定物件的類。這時候我們獲取物件的 式發 了改變。spring就是 我們的 以前 我們在獲取物件時,都是採 new的 式。是主動的。現在 我們獲取物件時,同時跟 要,有 為我們查詢或者建立物件。是被動的。這種被動接收的 式獲取物件的思想就是 控制反轉,它是spring框架的...
Spring核心之控制反轉(IoC)
概念 控制反轉 inversion of control,縮寫ioc 是物件導向程式設計中的一種設計原則,可以用來減低計算機 之間的耦合度。其中最常見的方式叫做依賴注入 dependency injection,簡稱di 還有一種方式叫 依賴查詢 dependency lookup 通過控制反轉,物...