<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Ioc模式(又稱DI:Dependency Injection)

    Ioc模式(又稱DI:Dependency Injection)

    分離關(guān)注( Separation of Concerns : SOC)是Ioc模式和AOP產(chǎn)生最原始動力,通過功能分解可得到關(guān)注點,這些關(guān)注可以是 組件Components, 方面Aspects或服務(wù)Services。

      從GoF設(shè)計模式中,我們已經(jīng)習(xí)慣一種思維編程方式:Interface Driven Design 接口驅(qū)動,接口驅(qū)動有很多好處,可以提供不同靈活的子類實現(xiàn),增加代碼穩(wěn)定和健壯性等等,但是接口一定是需要實現(xiàn)的,也就是如下語句遲早要執(zhí)行:

      AInterface a = new AInterfaceImp();

      AInterfaceImp是接口AInterface的一個子類,Ioc模式可以延緩接口的實現(xiàn),根據(jù)需要實現(xiàn),有個比喻:接口如同空的模型套,在必要時,需要向模型套注射石膏,這樣才能成為一個模型實體,因此,我們將人為控制接口的實現(xiàn)成為“注射”。

      Ioc英文為 Inversion of Control,即反轉(zhuǎn)模式,這里有著名的好萊塢理論:你呆著別動,到時我會找你。

      其實Ioc模式也是解決調(diào)用者和被調(diào)用者之間的一種關(guān)系,上述AInterface實現(xiàn)語句表明當前是在調(diào)用被調(diào)用者AInterfaceImp,由于被調(diào)用者名稱寫入了調(diào)用者的代碼中,這產(chǎn)生了一個接口實現(xiàn)的原罪:彼此聯(lián)系,調(diào)用者和被調(diào)用者有緊密聯(lián)系,在UML中是用依賴 Dependency 表示。

      但是這種依賴在分離關(guān)注的思維下是不可忍耐的,必須切割,實現(xiàn)調(diào)用者和被調(diào)用者解耦,新的Ioc模式 Dependency Injection 模式由此產(chǎn)生了, Dependency Injection模式是依賴注射的意思,也就是將依賴先剝離,然后在適當時候再注射進入。

    Ioc模式(Dependency Injection模式)有三種:

    第一種類型 從JNDI或ServiceManager等獲得被調(diào)用者,這里類似ServiceLocator模式。 1. EJB/J2EE
    2. Avalon(Apache的一個復(fù)雜使用不多的項目)
    第二種類型 使用JavaBeans的setter方法 1. Spring Framework,
    2. WebWork/XWork
    第三種類型 在構(gòu)造方法中實現(xiàn)依賴 1. PicoContainer,
    2. HiveMind

      有過EJB開發(fā)經(jīng)驗的人都知道,每個EJB的調(diào)用都需要通過JNDI尋找到工廠性質(zhì)的Home接口,在我的教程EJB是什么章節(jié)中,我也是從依賴和工廠模式角度來闡述EJB的使用。

      在通常傳統(tǒng)情況下,為了實現(xiàn)調(diào)用者和被調(diào)用者解耦,分離,一般是通過工廠模式實現(xiàn)的,下面將通過比較工廠模式和Ioc模式不同,加深理解Ioc模式。

    工廠模式和Ioc

      假設(shè)有兩個類B 和 C:B作為調(diào)用者,C是被調(diào)用者,在B代碼中存在對C的調(diào)用:

    public class B{
       private C comp;
      ......
    }

      實現(xiàn)comp實例有兩種途徑:單態(tài)工廠模式和Ioc。

    工廠模式實現(xiàn)如下:

    public class B{
       private C comp;
      private final static MyFactory myFactory = MyFactory.getInstance();

      public B(){
        this.comp = myFactory.createInstanceOfC();

      }
       public void someMethod(){
        this.comp.sayHello();
      }
      ......
    }

    特點:

    • 每次運行時,MyFactory可根據(jù)配置文件XML中定義的C子類實現(xiàn),通過createInstanceOfC()生成C的具體實例。

    使用Ioc依賴性注射( Dependency Injection )實現(xiàn)Picocontainer如下,B類如同通常POJO類,如下:

    public class B{
       private C comp;
      public B(C comp){
        this.comp = comp;
       }
       public void someMethod(){
        this.comp.sayHello();
       }
      ......
    }

    假設(shè)C接口/類有有一個具體實現(xiàn)CImp類。當客戶端調(diào)用B時,使用下列代碼:

    public class client{
       public static void main( String[] args ) {
        DefaultPicoContainer container = new DefaultPicoContainer();
        container.registerComponentImplementation(CImp.class);
        container.registerComponentImplementation(B.class);
        B b = (B) container.getComponentInstance(B.class);
        b.someMethod();
       }
    }

      因此,當客戶端調(diào)用B時,分別使用工廠模式和Ioc有不同的特點和區(qū)別:

      主要區(qū)別體現(xiàn)在B類的代碼,如果使用Ioc,在B類代碼中將不需要嵌入任何工廠模式等的代碼,因為這些工廠模式其實還是與C有些間接的聯(lián)系,這樣,使用Ioc徹底解耦了B和C之間的聯(lián)系。

      使用Ioc帶來的代價是:需要在客戶端或其它某處進行B和C之間聯(lián)系的組裝。

      所以,Ioc并沒有消除B和C之間這樣的聯(lián)系,只是轉(zhuǎn)移了這種聯(lián)系。
      這種聯(lián)系轉(zhuǎn)移實際也是一種分離關(guān)注,它的影響巨大,它提供了AOP實現(xiàn)的可能。

    Ioc和AOP

      AOP我們已經(jīng)知道是一種面向切面的編程方式,由于Ioc解放自由了B類,而且可以向B類實現(xiàn)注射C類具體實現(xiàn),如果把B類想像成運行時的橫向動作,無疑注入C類子類就是AOP中的一種Advice,如下圖:

      通過下列代碼說明如何使用Picocontainer實現(xiàn)AOP,該例程主要實現(xiàn)是記錄logger功能,通過Picocontainer可以使用簡單一行,使所有的應(yīng)用類的記錄功能激活。

    首先編制一個記錄接口:

    public interface Logging {

      public void enableLogging(Log log);

    }

    有一個LogSwitcher類,主要用來激活具體應(yīng)用中的記錄功能:

    import org.apache.commons.logging.Log;
    public class LogSwitcher
    {
      protected Log m_log;
      public void enableLogging(Log log) {
        m_log = log;
        m_log.info("Logging Enabled");
      }
    }

    一般的普通應(yīng)用JavaBeans都可以繼承這個類,假設(shè)PicoUserManager是一個用戶管理類,代碼如下:

    public class PicoUserManager extends LogSwitcher
    {

      ..... //用戶管理功能
    }
    public class PicoXXXX1Manager extends LogSwitcher
    {

      ..... //業(yè)務(wù)功能
    }
    public class PicoXXXX2Manager extends LogSwitcher
    {

      ..... //業(yè)務(wù)功能
    }

    注意LogSwitcher中Log實例是由外界賦予的,也就是說即將被外界注射進入,下面看看使用Picocontainer是如何注射Log的具體實例的。


    DefaultPicoContainer container = new DefaultPicoContainer();
    container.registerComponentImplementation(PicoUserManager.class);
    container.registerComponentImplementation(PicoXXXX1Manager.class);
    container.registerComponentImplementation(PicoXXXX2Manager.class);
    .....

    Logging logging = (Logging) container.getComponentMulticaster();

    logging.enableLogging(new SimpleLog("pico"));//激活log

      由上代碼可見,通過使用簡單一行l(wèi)ogging.enableLogging()方法使所有的應(yīng)用類的記錄功能激活。這是不是類似AOP的advice實現(xiàn)?

      總之,使用Ioc模式,可以不管將來具體實現(xiàn),完全在一個抽象層次進行描述和技術(shù)架構(gòu),因此,Ioc模式可以為容器、框架之類的軟件實現(xiàn)提供了具體的實現(xiàn)手段,屬于架構(gòu)技術(shù)中一種重要的模式應(yīng)用。J道的JdonSD框架也使用了Ioc模式。

    posted on 2006-07-03 10:55 77 閱讀(385) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2006年7月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(12)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊

    API文檔

    java開發(fā)與研究

    にほん

    上海房產(chǎn)

    東京生活

    數(shù)據(jù)庫大全

    編程與開發(fā)

    美國開發(fā)生活

    走向管理

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 美女视频黄a视频全免费| 国产一区二区三区在线观看免费| 67194在线午夜亚洲| 国产又黄又爽又刺激的免费网址| 成年免费a级毛片免费看无码| 亚洲另类春色校园小说| 亚洲成A人片77777国产| 国产精品爱啪在线线免费观看| 国产成人综合久久精品亚洲| 91情国产l精品国产亚洲区| 四虎永久精品免费观看| 88av免费观看| 一级女性全黄生活片免费看| 久久久国产亚洲精品| 亚洲AV电影院在线观看| 国产一卡二卡≡卡四卡免费乱码| 91精品国产免费入口| 青青久久精品国产免费看| 亚洲成AV人综合在线观看| 亚洲最大激情中文字幕| 国产精品酒店视频免费看| 蜜桃AV无码免费看永久| 91国内免费在线视频| 色偷偷亚洲第一综合| 亚洲字幕在线观看| 国产亚洲精品a在线无码| 四虎永久成人免费| 毛片a级三毛片免费播放| 777成影片免费观看| 9久久免费国产精品特黄| 精品一区二区三区免费毛片| 激情内射亚洲一区二区三区爱妻| 亚洲AV一宅男色影视| 亚洲成片观看四虎永久| 超pen个人视频国产免费观看 | 久久国产高潮流白浆免费观看| 色多多www视频在线观看免费| 亚洲午夜无码久久久久小说| 激情内射亚洲一区二区三区| 国产精一品亚洲二区在线播放 | 亚洲人成影院77777|