IOC控制反转浅析
1.控制反轉(zhuǎn)(Inversion of Control)與依賴注入(Dependency Injection)
?????????控制反轉(zhuǎn)即IoC (Inversion of Control),它把傳統(tǒng)上由程序代碼直接操控的對象的調(diào)用權(quán)交給容器,通過容器來實(shí)現(xiàn)對象組件的裝配和管理。所謂的“控制反轉(zhuǎn)”概念就是對組件對象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。
?????????IoC是一個很大的概念,可以用不同的方式來實(shí)現(xiàn)。其主要實(shí)現(xiàn)方式有兩種:<1>依賴查找(Dependency Lookup):容器提供回調(diào)接口和上下文環(huán)境給組件。EJB和Apache Avalon都使用這種方式。<2>依賴注入(Dependency Injection):組件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關(guān)系。后者是時下最流行的IoC類型,其又有接口注入(Interface Injection),設(shè)值注入(Setter Injection)和構(gòu)造子注入(Constructor Injection)三種方式。
?????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????圖1 控制反轉(zhuǎn)概念結(jié)構(gòu)
????????依賴注入之所以更流行是因為它是一種更可取的方式:讓容器全權(quán)負(fù)責(zé)依賴查詢,受管組件只需要暴露JavaBean的setter方法或者帶參數(shù)的構(gòu)造子或者接口,使容器可以在初始化時組裝對象的依賴關(guān)系。其與依賴查找方式相比,主要優(yōu)勢為:<1>查找定位操作與應(yīng)用代碼完全無關(guān)。<2>不依賴于容器的API,可以很容易地在任何容器以外使用應(yīng)用對象。<3>不需要特殊的接口,絕大多數(shù)對象可以做到完全不必依賴容器。
2.好萊塢原則
????????IoC體現(xiàn)了好萊塢原則,即“不要打電話過來,我們會打給你”。第一次遇到好萊塢原則是在了解模板方法(Template Mathod)模式的時候,模板方法模式的核心是,基類(抽象類)定義了算法的骨架,而將一些步驟延遲到子類中。
??????????????????????????????????
?????????????????????????????????????????????????????????????圖2 模板方法模式類圖
????????現(xiàn)在來考慮IoC的實(shí)現(xiàn)機(jī)制,組件定義了整個流程框架,而其中的一些業(yè)務(wù)邏輯的實(shí)現(xiàn)要借助于其他業(yè)務(wù)對象的加入,它們可以通過兩種方式參與到業(yè)務(wù)流程中,一種是依賴查找(Dependency Lookup),類似與JDNI的實(shí)現(xiàn),通過JNDI來找到相應(yīng)的業(yè)務(wù)對象(代碼1),另一種是依賴注入,通過IoC容器將業(yè)務(wù)對象注入到組件中。
3. 依賴查找(Dependency Lookup)
下面代碼展示了基于JNDI實(shí)現(xiàn)的依賴查找機(jī)制。
依賴查找的主要問題是,這段代碼必須依賴于JNDI環(huán)境,所以它不能在應(yīng)用服務(wù)器之外運(yùn)行,并且如果要用別的方式取代JNDI來查找資源和協(xié)作對象,就必須把JNDI代碼抽出來重構(gòu)到一個策略方法中去。
4.依賴注入(Dependency Injection)
依賴注入的基本原則是:應(yīng)用組件不應(yīng)該負(fù)責(zé)查找資源或者其他依賴的協(xié)作對象。配置對象的工作應(yīng)該由IoC容器負(fù)責(zé),“查找資源”的邏輯應(yīng)該從應(yīng)用組件的代碼中抽取出來,交給IoC容器負(fù)責(zé)。
下面分別演示3中注入機(jī)制。
待注入的業(yè)務(wù)對象Content.java
MyBusniess類展示了一個業(yè)務(wù)組件,它的實(shí)現(xiàn)需要對象Content的注入。
- 構(gòu)造子注入
- 設(shè)值注入
- 接口注入
5.依賴拖拽(Dependency Pull)
最后需要介紹的是依賴拖拽,注入的對象如何與組件發(fā)生聯(lián)系,這個過程就是通過依賴拖拽實(shí)現(xiàn)。
代碼7 依賴拖拽示例
而通常對注入對象的配置可以通過一個xml文件完成。
使用這種方式對對象進(jìn)行集中管理,使用依賴拖拽與依賴查找本質(zhì)的區(qū)別是,依賴查找是在業(yè)務(wù)組件代碼中進(jìn)行的,而不是從一個集中的注冊處,特定的地點(diǎn)執(zhí)行。
文章來自:http://zhangjunhd.blog.51cto.com/113473/126530/
wiki解釋
總結(jié)
- 上一篇: 自己看书的清单
- 下一篇: Dagger简单Demo