国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

控制反轉(Inversion of Control)與依賴注入(Dependency Injection)

2019-11-08 03:27:34
字體:
來源:轉載
供稿:網友
1.控制反轉(Inversion of Control)與依賴注入(Dependency Injection)控制反轉即IoC (Inversion of Control),它把傳統上由程序代碼直接操控的對象的調用權交給容器,通過容器來實現對象組件的裝配和管理。所謂的“控制反轉”概念就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器。IoC是一個很大的概念,可以用不同的方式來實現。其主要實現方式有兩種:<1>依賴查找(Dependency Lookup):容器提供回調接口和上下文環境給組件。EJB和Apache Avalon都使用這種方式。<2>依賴注入(Dependency Injection):組件不做定位查詢,只提供普通的java方法讓容器去決定依賴關系。后者是時下最流行的IoC類型,其又有接口注入(Interface Injection),設值注入(Setter Injection)和構造子注入(Constructor Injection)三種方式。圖1 控制反轉概念結構依賴注入之所以更流行是因為它是一種更可取的方式:讓容器全權負責依賴查詢,受管組件只需要暴露JavaBean的setter方法或者帶參數的構造子或者接口,使容器可以在初始化時組裝對象的依賴關系。其與依賴查找方式相比,主要優勢為:<1>查找定位操作與應用代碼完全無關。<2>不依賴于容器的API,可以很容易地在任何容器以外使用應用對象。<3>不需要特殊的接口,絕大多數對象可以做到完全不必依賴容器。 2.好萊塢原則IoC體現了好萊塢原則,即“不要打電話過來,我們會打給你”。第一次遇到好萊塢原則是在了解模板方法(Template Mathod)模式的時候,模板方法模式的核心是,基類(抽象類)定義了算法的骨架,而將一些步驟延遲到子類中。圖2 模板方法模式類圖 現在來考慮IoC的實現機制,組件定義了整個流程框架,而其中的一些業務邏輯的實現要借助于其他業務對象的加入,它們可以通過兩種方式參與到業務流程中,一種是依賴查找(Dependency Lookup),類似與JDNI的實現,通過JNDI來找到相應的業務對象(代碼1),另一種是依賴注入,通過IoC容器將業務對象注入到組件中。 3. 依賴查找(Dependency Lookup)下面代碼展示了基于JNDI實現的依賴查找機制。
public class MyBusniessObject{  PRivate DataSource ds;  private MyCollaborator myCollaborator;   public MyBusnissObject(){Context ctx = null;try{    ctx = new InitialContext();    ds = (DataSource) ctx.lookup(“java:comp/env/dataSourceName”);    myCollaborator = (MyCollaborator) ctx.lookup(“java:comp/env/myCollaboratorName”);    }……
代碼1依賴查找(Dependency Lookup)代碼實現依賴查找的主要問題是,這段代碼必須依賴于JNDI環境,所以它不能在應用服務器之外運行,并且如果要用別的方式取代JNDI來查找資源和協作對象,就必須把JNDI代碼抽出來重構到一個策略方法中去。 4. 依賴注入(Dependency Injection)依賴注入的基本原則是:應用組件不應該負責查找資源或者其他依賴的協作對象。配置對象的工作應該由IoC容器負責,“查找資源”的邏輯應該從應用組件的代碼中抽取出來,交給IoC容器負責。下面分別演示3中注入機制。代碼2 待注入的業務對象Content.java
package com.zj.ioc.di; public class Content {     public void BusniessContent(){       System.out.println("do business");    }       public void AnotherBusniessContent(){       System.out.println("do another business");    }}
MyBusniess類展示了一個業務組件,它的實現需要對象Content的注入。代碼3,代碼4,代碼5,6分別演示構造子注入(Constructor Injection),設值注入(Setter Injection)和接口注入(Interface Injection)三種方式。 代碼3構造子注入(Constructor Injection)MyBusiness.java
package com.zj.ioc.di.ctor;import com.zj.ioc.di.Content; public class MyBusiness {    private Content myContent;     public MyBusiness(Content content) {       myContent = content;    }       public void doBusiness(){       myContent.BusniessContent();    }       public void doAnotherBusiness(){       myContent.AnotherBusniessContent();    }}
 代碼4設值注入(Setter Injection) MyBusiness.java
package com.zj.ioc.di.set;import com.zj.ioc.di.Content; public class MyBusiness {    private Content myContent;     public void setContent(Content content) {       myContent = content;    }       public void doBusiness(){       myContent.BusniessContent();    }       public void doAnotherBusiness(){       myContent.AnotherBusniessContent();    }}
 代碼5 設置注入接口InContent.java
package com.zj.ioc.di.iface;import com.zj.ioc.di.Content; public interface InContent {    void createContent(Content content);}
 代碼6接口注入(Interface Injection)MyBusiness.java
package com.zj.ioc.di.iface;import com.zj.ioc.di.Content; public class MyBusiness implements InContent{    private Content myContent;     public void createContent(Content content) {       myContent = content;    }       public void doBusniess(){       myContent.BusniessContent();    }       public void doAnotherBusniess(){       myContent.AnotherBusniessContent();    }}
 5.依賴拖拽(Dependency Pull)最后需要介紹的是依賴拖拽,注入的對象如何與組件發生聯系,這個過程就是通過依賴拖拽實現。代碼7 依賴拖拽示例
public static void main(String[] args) throws Exception{//get the bean factoryBeanFactory factory = getBeanFactory();MessageRender mr = (MessageRender) factory.getBean(“renderer”);mr.render();}
而通常對注入對象的配置可以通過一個xml文件完成。使用這種方式對對象進行集中管理,使用依賴拖拽與依賴查找本質的區別是,依賴查找是在業務組件代碼中進行的,而不是從一個集中的注冊處,特定的地點執行。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 寿阳县| 阳原县| 清涧县| 南部县| 宿迁市| 英吉沙县| 广河县| 理塘县| 云梦县| 镇巴县| 铜鼓县| 竹北市| 徐闻县| 陕西省| 安宁市| 小金县| 特克斯县| 济南市| 蓬溪县| 晋宁县| 灌南县| 易门县| 尚志市| 长白| 襄城县| 甘泉县| 池州市| 萨嘎县| 涞水县| 濉溪县| 克拉玛依市| 云梦县| 岑溪市| 嘉峪关市| 葵青区| 类乌齐县| 牟定县| 满洲里市| 阿图什市| 松江区| 宿松县|