spring的核心思想是IOC和AOP,IOC-控制反轉,是一個重要的面向對象編程的法則來消減計算機程序的耦合問題,控制反轉一般分為兩種類型,依賴注入和依賴查找,依賴什么?為什么需要依賴?注入什么?控制什么?依賴注入和控制反轉是一樣的概念嗎?接觸新的知識,小編的腦袋中全是大大的問號,不過沒有關系,今天這篇博文,小編主要來簡單的介紹一下在spring IOC中依賴注入的方法。 依賴注入和控制反轉,目的是為了使類與類之間解耦合,提高系統(tǒng)的可擴展性和可維護性。我們可以從以下幾個方面理解: a、參與者都有誰? b、依賴:誰依賴誰?為什么需要依賴? c、注入:誰注入誰?又注入了什么呢? d、控制反轉:誰控制誰?控制什么?為什么叫反轉呢?存在正轉嗎? e、控制反轉和依賴注入是同一個概念嗎?我們需要弄明白上面的問題,這樣對于控制反轉和依賴注入的理解有大大的幫助。 首先:第一個問題,參與者都有誰? 1)對象 2)IOC/DI容器 3)某個對象的外部資源 第二問題:依賴,誰依賴誰?為什么需要依賴? 依賴嘛,很好理解的,對象依賴于IOC/DI容器,至于為什么要依賴呢?對象需要IOC/DI容器來提供對象需要的外部資源。 第三個問題:注入,誰注入誰?又注入了什么呢? 顯而易見是IOC/DI容器注入對象,注入了what呢?肯定注入的是某個需要的東西那就是注入對象所需要的資源,肯定不會注入無關緊要的內容,你說呢? 第四個問題:控制反轉,誰控制誰?控制什么?為什么叫反轉呢?存在正轉嗎? 控制反轉,控制什么?肯定是IOC/DI容器控制對象,主要是控制對象實例的創(chuàng)建,反轉是相對于正向而言的,那么什么算是正向的呢?考慮一下常規(guī)情況下的應用程序,如果要在A里面使用C,你會怎么做呢?當然是直接去創(chuàng)建C的對象,也就是說,是在A類中主動去獲取所需要的外部資源C,這種情況被稱為正向的。那么什么是反向呢?就是A類不再主動去獲取C,而是被動等待,等待IoC/DI的容器獲取一個C的實例,然后反向的注入到A類中。 第五個問題:控制反轉和依賴注入式同一個概念嗎? 依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。依賴注入是從應用程序的角度在描述,可以把依賴注入描述完整點:應用程序依賴容器創(chuàng)建并注入它所需要的外部資源;而控制反轉是從容器的角度在描述,描述完整點:容器控制應用程序,由容器反向的向應用程序注入應用程序所需要的外部資源。 了解了這些基本的概念,弄明白她們之間的聯(lián)系和區(qū)別,能夠幫助我們更好的理解,接著小編來重點介紹一下依賴注入,在spring ioc中有三種依賴注入,分別是: a、接口注入; b、setter方法注入; c、構造方法注入; 接著小編對這三種注入方式一一進行講解,通過demo的講解,希望能夠幫助小伙伴們更好的理解,不足之處還請多多指教。 接口注入 [java] view plain copy print?
解釋一下上述的代碼部分,ClassA依賴于InterfaceB的實現(xiàn),我們如何獲得InterfaceB的實現(xiàn)實例呢?傳統(tǒng)的方法是在代碼中創(chuàng)建 InterfaceB實現(xiàn)類的實例,并將賦予clzB.這樣一來,ClassA在編譯期即依賴于InterfaceB的實現(xiàn)。為了將調用者與實現(xiàn)者在編譯期分離,于是有了上面的代碼。我們根據(jù)預先在配置文件中設定的實現(xiàn)類的類名(Config.BImplementation),動態(tài)加載實現(xiàn)類,并通過InterfaceB強制轉型后為ClassA所用,這就是接口注入的一個最原始的雛形。 setter方法注入 setter注入模式在實際開發(fā)中有非常廣泛的應用,setter方法更加直觀,我們來看一下spring的配置文件: [java] view plain copy print?
接著我們來看一下,setter表示依賴關系的寫法 [java] view plain copy print?
構造器注入 構造器注入,即通過構造函數(shù)完成依賴關系的設定。我們看一下spring的配置文件: [java] view plain copy print?
我們再來看一下,構造器表示依賴關系的寫法,代碼如下所示: [java] view plain copy print?
接口注入 && setter注入 && 構造器注入 接口注入: 接口注入模式因為具備侵入性,它要求組件必須與特定的接口相關聯(lián),因此并不被看好,實際使用有限。 Setter 注入: 對于習慣了傳統(tǒng) javabean 開發(fā)的程序員,通過 setter 方法設定依賴關系更加直觀。如果依賴關系較為復雜,那么構造子注入模式的構造函數(shù)也會相當龐大,而此時設值注入模式則更為簡潔。如果用到了第三方類庫,可能要求我們的組件提供一個默認的構造函數(shù),此時構造子注入模式也不適用。 構造器注入: 在構造期間完成一個完整的、合法的對象。所有依賴關系在構造函數(shù)中集中呈現(xiàn)。依賴關系在構造時由容器一次性設定,組件被創(chuàng)建之后一直處于相對“不變”的穩(wěn)定狀態(tài)。只有組件的創(chuàng)建者關心其內部依賴關系,對調用者而言,該依賴關系處于“黑盒”之中。 |
|