Spring的核心機(jī)制依賴注入_第1頁
Spring的核心機(jī)制依賴注入_第2頁
Spring的核心機(jī)制依賴注入_第3頁
Spring的核心機(jī)制依賴注入_第4頁
Spring的核心機(jī)制依賴注入_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Spring能有效地組織J2EE應(yīng)用各層的對(duì)象。不管是控制層的Action對(duì)象,還是業(yè)務(wù)層的Service對(duì)象,還是持久層的DAO對(duì)象,都可在 Spring的管理下有機(jī)地協(xié)調(diào)、運(yùn)行。Spring將各層的對(duì)象以松耦合的方式組織在一起,Action對(duì)象無須關(guān)心Service對(duì)象的具體實(shí) 現(xiàn),Service對(duì)象無須關(guān)心持久層對(duì)象的具體實(shí)現(xiàn),各層對(duì)象的調(diào)用完全面向接口。當(dāng)系統(tǒng)需要重構(gòu)時(shí),代碼的改寫量將大大減少。 上面所說的一切都得宜于Spring的核心機(jī)制,依賴注入。依賴注入讓bean與bean之間以配置文件組織在一起,而不是以硬編碼的方式耦合在一起。理解依賴注入 依賴注入(Dependency

2、60;Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念。具體含義是:當(dāng)某個(gè)角色 (可能是一個(gè)Java實(shí)例,調(diào)用者)需要另一個(gè)角色(另一個(gè)Java實(shí)例,被調(diào)用者)的協(xié)助時(shí),在傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí) 例。但在Spring里,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱為控制反轉(zhuǎn);創(chuàng)建被調(diào)用者實(shí)例的工作通常由Spring容器來完成,然后注入調(diào)用 者,因此也稱為依賴注入。 不管是依賴注入,還是控制反轉(zhuǎn),都說明Spring采用動(dòng)態(tài)、靈活的方式來管理各種對(duì)象。對(duì)象與對(duì)象之間的具體實(shí)現(xiàn)互相透明。在理解依賴注入之前,看如下

3、這個(gè)問題在各種社會(huì)形態(tài)里如何解決:一個(gè)人(Java實(shí)例,調(diào)用者)需要一把斧子(Java實(shí)例,被調(diào)用者)。 (1)原始社會(huì)里,幾乎沒有社會(huì)分工。需要斧子的人(調(diào)用者)只能自己去磨一把斧子(被調(diào)用者)。對(duì)應(yīng)的情形為:Java程序里的調(diào)用者自己創(chuàng)建被調(diào)用者。 (2)進(jìn)入工業(yè)社會(huì),工廠出現(xiàn)。斧子不再由普通人完成,而在工廠里被生產(chǎn)出來,此時(shí)需要斧子的人(調(diào)用者)找到工廠,購買斧子,無須關(guān)心斧子的制造過程。對(duì)應(yīng)Java程序的簡單工廠的設(shè)計(jì)模式。 (3)進(jìn)入“按需分配”社會(huì),需要斧子的人不需要找到工廠,坐在家里發(fā)出一個(gè)簡單指令:需要斧子。斧子就自然出現(xiàn)在他面前。對(duì)應(yīng)Spring的依賴注入。 第一種情況下,J

4、ava實(shí)例的調(diào)用者創(chuàng)建被調(diào)用的Java實(shí)例,必然要求被調(diào)用的Java類出現(xiàn)在調(diào)用者的代碼里。無法實(shí)現(xiàn)二者之間的松耦合。 第二種情況下,調(diào)用者無須關(guān)心被調(diào)用者具體實(shí)現(xiàn)過程,只需要找到符合某種標(biāo)準(zhǔn)(接口)的實(shí)例,即可使用。此時(shí)調(diào)用的代碼面向接口編程,可以讓調(diào)用者和被調(diào)用者解耦,這也是工廠模式大量使用的原因。但調(diào)用者需要自己定位工廠,調(diào)用者與特定工廠耦合在一起。 第三種情況下,調(diào)用者無須自己定位工廠,程序運(yùn)行到需要被調(diào)用者時(shí),系統(tǒng)自動(dòng)提供被調(diào)用者實(shí)例。事實(shí)上,調(diào)用者和被調(diào)用者都處于Spring的管理下,二者之間的依賴關(guān)系由Spring提供。 所謂依賴注入,是指程序運(yùn)行過程中,如果需要調(diào)用另一個(gè)對(duì)象協(xié)

5、助時(shí),無須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部的注入。Spring的依賴注入對(duì)調(diào)用者和被調(diào)用者幾乎沒有任何要求,完全支持對(duì)POJO之間依賴關(guān)系的管理。依賴注入通常有兩種: ·設(shè)值注入。 ·構(gòu)造注入。 設(shè)值注入 設(shè)值注入是指通過setter方法傳入被調(diào)用者的實(shí)例。這種注入方式簡單、直觀,因而在Spring的依賴注入里大量使用。看下面代碼,是Person的接口 然后是Axe的接口 Person的實(shí)現(xiàn)類 Axe的第一個(gè)實(shí)現(xiàn)類下面采用Spring的配置文件將Person實(shí)例和Axe實(shí)例組織在一起。配置文件如下所示: 從配置文件中,可以看到Sp

6、ring管理bean的靈巧性。bean與bean之間的依賴關(guān)系放在配置文件里組織,而不是寫在代碼里。通過配置文件的 指定,Spring能精確地為每個(gè)bean注入屬性。因此,配置文件里的bean的class元素,不能僅僅是接口,而必須是真正的實(shí)現(xiàn)類。 Spring會(huì)自動(dòng)接管每個(gè)bean定義里的property元素定義。Spring會(huì)在執(zhí)行無參數(shù)的構(gòu)造器后、創(chuàng)建默認(rèn)的bean實(shí)例后,調(diào)用對(duì)應(yīng)的 setter方法為程序注入屬性值。property定義的屬性值將不再由該bean來主動(dòng)創(chuàng)建、管理,而改為被動(dòng)接收Spring的注入。 每個(gè)bean的id屬性是該bean的惟一標(biāo)識(shí),程序通過id屬性訪問bea

7、n,bean與bean的依賴關(guān)系也通過id屬性完成。 下面看主程序部分:程序的執(zhí)行結(jié)果如下: 石斧砍柴好慢 主程序調(diào)用Person的useAxe()方法時(shí),該方法的方法體內(nèi)需要 使用Axe的實(shí)例,但程序里沒有任何地方將特定的Person實(shí)例和Axe實(shí)例耦合在一起?;蛘哒f,程序里沒有為Person實(shí)例傳入Axe的實(shí) 例,Axe實(shí)例由Spring在運(yùn)行期間動(dòng)態(tài)注入。 Person實(shí)例不僅不需要了解Axe實(shí)例的具體實(shí)現(xiàn),甚至無須了解Axe的創(chuàng) 建過程。程序在運(yùn)行到需要Axe實(shí)例的時(shí)候,Spring創(chuàng)建了Axe實(shí)例,然后注入給需要Axe實(shí)例的調(diào)用者。Person實(shí)例運(yùn)行到需要Axe實(shí)例的 地方,自然就

8、產(chǎn)生了Axe實(shí)例,用來供Person實(shí)例使用。 調(diào)用者不僅無須關(guān)心被調(diào)用者的實(shí)現(xiàn)過程,連工廠定位都可以省略(真是按需分配啊!)。下面也給出使用Ant編譯和運(yùn)行該應(yīng)用的簡單腳本:如果需要改寫Axe的實(shí)現(xiàn)類。或者說,提供另一個(gè)實(shí)現(xiàn)類給Person實(shí)例使用。Person接口、Chinese類都無須改變。只需提供另一個(gè)Axe的實(shí)現(xiàn),然后對(duì)配置文件進(jìn)行簡單的修改即可。 Axe的另一個(gè)實(shí)現(xiàn)如下:然后,修改原來的Spring配置文件,在其中增加如下一行:該行重新定義了一個(gè)Axe的實(shí)現(xiàn):SteelAxe。然后修改chinese bean的配置,將原來傳入stoneAxe的地方改為傳入steelAxe

9、。也就是將此時(shí)再次執(zhí)行程序,將得到如下結(jié)果: 鋼斧砍柴真快 Person與Axe之間沒有任何代碼耦合關(guān)系,bean與bean之間的依賴關(guān)系由Spring管理。采用setter方法為目標(biāo)bean注入屬性的方式,稱為設(shè)值注入。 業(yè)務(wù)對(duì)象的更換變得相當(dāng)簡單,對(duì)象與對(duì)象之間的依賴關(guān)系從代碼里分離出來,通過配置文件動(dòng)態(tài)管理。 構(gòu)造注入 所謂構(gòu)造注入,指通過構(gòu)造函數(shù)來完成依賴關(guān)系的設(shè)定,而不是通過setter方法。對(duì)前面代碼Chinese類做簡單的修改,修改后的代碼如下:此時(shí)無須Chinese類里的setAxe方法,構(gòu)造Person實(shí)例時(shí),Spring為Person實(shí)例注入所依賴的Axe實(shí)例。構(gòu)造注入的配置文件也需做簡單的修改,修改后的配置文件如下:執(zhí)行效果與使用steelAxe設(shè)值注入時(shí)的執(zhí)行效果完全一樣。區(qū)別在于:創(chuàng)建Person實(shí)例中Axe屬性的時(shí)機(jī)不同設(shè)值注入是現(xiàn)創(chuàng)建一個(gè)默認(rèn) 的bean實(shí)例,然后調(diào)用對(duì)應(yīng)的構(gòu)造方法注入依賴關(guān)系。而構(gòu)造注入則在創(chuàng)建bean實(shí)例時(shí),已經(jīng)完成了依賴關(guān)系的注入。 設(shè)值注入:默認(rèn)構(gòu)造方法>創(chuàng)建實(shí)例>調(diào)setXXX注入                 

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論