IoC,
用白話來講,就是由容器控制程序之間的關(guān)系,而非傳統(tǒng)實現(xiàn)中,由程序代碼直接操控。這也就是所謂“控制反轉(zhuǎn)”的概念所在:控制權(quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移,是所謂反轉(zhuǎn)。
DI,
依賴注入的幾種實現(xiàn)類型:
1.接口注入
2.構(gòu)造子注入
3.設(shè)值注入
幾種依賴注入模式的對比總結(jié)
接口注入模式因為具備侵入性,它要求組件必須與特定的接口相關(guān)聯(lián),因此并不被看好,實際使用有限。
Type2和Type3的依賴注入實現(xiàn)模式均具備無侵入性的特點。在筆者看來,這兩種實現(xiàn)方式各有特點,也各具優(yōu)勢(一句經(jīng)典廢話J)。
Type2 構(gòu)造子注入的優(yōu)勢:
1. “在構(gòu)造期即創(chuàng)建一個完整、合法的對象”,對于這條Java設(shè)計原則,Type2無疑是最好的
響應(yīng)者。
2. 避免了繁瑣的setter方法的編寫,所有依賴關(guān)系均在構(gòu)造函數(shù)中設(shè)定,依賴關(guān)系集中呈現(xiàn),
更加易讀。
3. 由于沒有setter方法,依賴關(guān)系在構(gòu)造時由容器一次性設(shè)定,因此組件在被創(chuàng)建之后即處于相對“不變”的穩(wěn)定狀態(tài),無需擔(dān)心上層代碼在調(diào)用過程中執(zhí)行setter方法對組件依賴關(guān)系產(chǎn)生破壞,特別是對于Singleton模式的組件而言,這可能對整個系統(tǒng)產(chǎn)生重大的影響。
4. 同樣,由于關(guān)聯(lián)關(guān)系僅在構(gòu)造函數(shù)中表達(dá),只有組件創(chuàng)建者需要關(guān)心組件內(nèi)部的依賴關(guān)系。對調(diào)用者而言,組件中的依賴關(guān)系處于黑盒之中。對上層屏蔽不必要的信息,也為系統(tǒng)的層次清晰性提供了保證。
5. 通過構(gòu)造子注入,意味著我們可以在構(gòu)造函數(shù)中決定依賴關(guān)系的注入順序,對于一個大量依賴外部服務(wù)的組件而言,依賴關(guān)系的獲得順序可能非常重要,比如某個依賴關(guān)系注入的
先決條件是組件的DataSource及相關(guān)資源已經(jīng)被設(shè)定。
Type3 設(shè)值注入的優(yōu)勢
1. 對于習(xí)慣了傳統(tǒng)JavaBean開發(fā)的程序員而言,通過setter方法設(shè)定依賴關(guān)系顯得更加直
觀,更加自然。
2. 如果依賴關(guān)系(或繼承關(guān)系)較為復(fù)雜,那么Type2模式的構(gòu)造函數(shù)也會相當(dāng)龐大(我們需要在構(gòu)造函數(shù)中設(shè)定所有依賴關(guān)系),此時Type3模式往往更為簡潔。
3. 對于某些第三方類庫而言,可能要求我們的組件必須提供一個默認(rèn)的構(gòu)造函數(shù)(如Struts
中的Action),此時Type2類型的依賴注入機制就體現(xiàn)出其局限性,難以完成我們期望的功
能。
注:本文的很多總結(jié)來源于對《spring框架,技術(shù)詳解及使用指導(dǎo)》(作者:夏昕)的學(xué)習(xí)。