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

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

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

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    什么是Ioc(Inversion of Control) (zhuan)

    這篇短文基本上是改編自Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern,目的呢,是讓讀者能夠在最短時間內了解IoC的概念。這也是我一貫的“風格”:最短的文字、最精要的內容、最清晰的說明。希望我能做到,自勉^_^


    J2EE應用開發中,經常遇到的問題就是:如何將不同的組件組裝成為一個內聚的應用程序?IoC模式可以解決這個問題,其目標是將組件的配置與使用分離開。

    IoCInversion of Control,控制反轉[1],其原理是基于OO設計原則的The Hollywood PrincipleDon't call us, we'll call you。也就是說,所有的組件[2]都是被動的(Passive),所有的組件初始化和調用都由容器負責。組件處在一個容器當中,由容器負責管理。

    要說明IoC模式最好的方法是使用代碼。下邊是一段正常的代碼。

    class ClassA...

      public String aMethod(String arg){

        String result = instanceOfClassB.bMethod();

        do something;

        return result;

      }

    在上邊的代碼里,我們要解決的問題是:ClassA如何獲得ClassB的實例?一個最直接的方法是在aMethod里聲明:

    IClassB instanceOfClassB = new ClassB();

    這里使用了一個接口IClassB

    問題是,如果出現這樣的情況:繼續使用ClassA,但要求用IClassB的另一個實現ClassB2代替ClassB呢?更概括一點說:ClassA怎樣才能找到IClassB的具體實現?很明顯,上述代碼增加ClassAClassB的耦合度,以致于無法在不修改ClassA的情況下變更IClassB的具體實現。

    IoC模式就是用于解決這樣的問題。當然,還有其他的方法,比如Service Locator模式,但現在我們只關注IoC。如前所述,IoC容器負責初始化組件(如IClassB),并將實例交給使用者。使用代碼或配置文件以聲明的方式將接口與實例關聯起來,IoC容器負責進行實際的調用處理。對于調用者,只需要關注接口就行了。

    根據實例傳入方式的不同,IoC分為type 1 IoC(接口注入[3])、type 2 IoC(設值方法注入)和type 3 IoC(構造子注入)。分別用代碼說明如下:

    type 1 IoC(接口注入)

    public interface GetClassB {

      void getClassB(IClassB instanceOfClassB);

    }

     

    class ClassA implements GetClassB…

      IClassB instanceOfClassB;

      void getClassB(IClassB instanceOfClassB) {

    this.instanceOfClassB = instanceOfClassB;

      }

    type 2 IoC(設值方法注入)

    class ClassA...

      IClassB instanceOfClassB;

      public void setFinder(IClassB instanceOfClassB) {

        this.instanceOfClassB = instanceOfClassB;

      }

    type 3 IoC(構造子注入)

    class ClassA…

    ClassB instanceOfClassB;

      public classA(IClassB instanceOfClassB) {

        this. instanceOfClassB = instanceOfClassB;

      }

      Spring使用的是type 2 IoC。


    [1] Martin FowlerInversion of Control Containers and the Dependency Injection pattern一文中,作者提出本模式更準確的名稱應該是Dependency Injection。考慮到使用上的習慣,在本文檔中我們將繼續使用IoC的概念。

    [2] 同一篇文章中,Martin Fowler還提出了Componet(組件)與Service(服務)的區別問題。我個人認為“組件”更有助于幫助我們理解IoC的概念,所以在本文檔中使用“組件”來代表“組件或服務”

    [3] 如上所述,注入是另一種說法,此處只用于輔助說明。


    posted on 2006-03-11 08:28 都市淘沙者 閱讀(2952) 評論(0)  編輯  收藏 所屬分類: Spring+Struts+Hibernate

    主站蜘蛛池模板: 亚洲精品白色在线发布| 国产精品无码亚洲精品2021| 97人伦色伦成人免费视频| MM1313亚洲国产精品| 亚洲欧洲∨国产一区二区三区| 国产成人精品免费视频大全麻豆| 国产成人亚洲综合无| 久久精品国产亚洲av四虎| 一区二区无码免费视频网站| 和老外3p爽粗大免费视频| 亚洲午夜久久久精品电影院| 亚洲AV无码乱码在线观看牲色| 无码A级毛片免费视频内谢| 亚洲av无码专区在线观看亚| 久久亚洲国产成人亚| 暖暖日本免费在线视频| 少妇太爽了在线观看免费视频| 亚洲成a人无码亚洲成www牛牛 | 最近中文字幕大全中文字幕免费| 亚洲AV无码专区在线电影成人| 久久精品国产亚洲| 四虎影视精品永久免费| 1000部国产成人免费视频| 国产精品免费看久久久香蕉| 亚洲国产日韩视频观看| 亚洲伦另类中文字幕| 亚洲精品乱码久久久久久不卡 | 日韩精品免费一区二区三区| 国产成人精品无码免费看| 美女视频黄频a免费| 亚洲国产超清无码专区| 国产av天堂亚洲国产av天堂 | 国产a不卡片精品免费观看| 日日麻批免费40分钟日本的| 99久久免费国产精品热| 青青草97国产精品免费观看| 亚洲七久久之综合七久久| 亚洲国产成人va在线观看网址| 国产V亚洲V天堂无码久久久| 精品亚洲成α人无码成α在线观看 | 黄页网站在线看免费|