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

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

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

    posts - 6,  comments - 3,  trackbacks - 0

    介紹 IOC 

    作者:冰云 icecloud(AT)sina.com
    BLOG: http://icecloud.51.net

    時(shí)間:2004.02.15

     

    版權(quán)聲明:

    本文由冰云完成,首發(fā)于CSDN,作者保留中文版權(quán)。
    未經(jīng)許可,不得使用于任何商業(yè)用途。
    歡迎轉(zhuǎn)載,但請保持文章及版權(quán)聲明完整。
    如需聯(lián)絡(luò)請發(fā)郵件:icecloud(AT)sina.com

    一、什么是IOC

    IoC就是Inversion of Control,控制反轉(zhuǎn)。在Java開發(fā)中,IoC意味著將你設(shè)計(jì)好的類交給系統(tǒng)去控制,而不是在你的類內(nèi)部控制。這稱為控制反轉(zhuǎn)。

     

    下面我們以幾個(gè)例子來說明什么是IoC

     

    假設(shè)我們要設(shè)計(jì)一個(gè)Girl和一個(gè)Boy類,其中Girlkiss方法,即Girl想要Kiss一個(gè)Boy。那么,我們的問題是,Girl如何能夠認(rèn)識這個(gè)Boy

        在我們中國,常見的MM與GG的認(rèn)識方式有以下幾種

        1 青梅竹馬;  2 親友介紹;  3 父母包辦

     

        那么哪一種才是最好呢?

        青梅竹馬Girl從小就知道自己的Boy

       

       

     

    public class Girl {  
        void kiss(){
           Boy boy = new Boy();
        }
    }

     

     

        然而從開始就創(chuàng)建的Boy缺點(diǎn)就是無法在更換。并且要負(fù)責(zé)Boy的整個(gè)生命周期。如果我們的Girl想要換一個(gè)怎么辦?(筆者嚴(yán)重不支持Girl經(jīng)常更換Boy

     

        親友介紹:由中間人負(fù)責(zé)提供Boy來見面

           


    public
    class Girl {
        void kiss(){
           Boy boy = BoyFactory.createBoy();      
        }
    }

     

        親友介紹,固然是好。如果不滿意,盡管另外換一個(gè)好了。但是,親友BoyFactory經(jīng)常是以Singleton的形式出現(xiàn),不然就是,存在于Globals,無處不在,無處不能。實(shí)在是太繁瑣了一點(diǎn),不夠靈活。我為什么一定要這個(gè)親友摻和進(jìn)來呢?為什么一定要付給她介紹費(fèi)呢?萬一最好的朋友愛上了我的男朋友呢?

     

        父母包辦:一切交給父母,自己不用費(fèi)吹灰之力,只需要等著Kiss就好了。

     

          


    public
    class Girl {
        void kiss(Boy boy){
           // kiss boy  
          boy.kiss();
        }
    }

        Well,這是對Girl最好的方法,只要想辦法賄賂了Girl的父母,并把Boy交給他。那么我們就可以輕松的和GirlKiss了。看來幾千年傳統(tǒng)的父母之命還真是有用哦。至少BoyGirl不用自己瞎忙乎了。

        這就是IOC,將對象的創(chuàng)建和獲取提取到外部。由外部容器提供需要的組件。

     

        我們知道好萊塢原則“Do not call us, we will call you.” 意思就是,You, girlie, do not call the boy. We will feed you a boy

     

        我們還應(yīng)該知道依賴倒轉(zhuǎn)原則 Dependence Inversion PrincinpleDIP

     

    Eric Gamma說,要面向抽象編程。面向接口編程是面向?qū)ο蟮暮诵摹?/SPAN>

    組件應(yīng)該分為兩部分,即

    Service, 所提供功能的聲明

    Implementation, Service的實(shí)現(xiàn)

    好處是:多實(shí)現(xiàn)可以任意切換,防止 everything depends on everything 問題.即具體依賴于具體。

    所以,我們的Boy應(yīng)該是實(shí)現(xiàn)Kissable接口。這樣一旦Girl不想kiss可惡的Boy的話,還可以kiss可愛的kitten和慈祥的grandmother

     

    二、IOCtype

        IoCType指的是Girl得到Boy的幾種不同方式。我們逐一來說明。

     

        IOC type 0不用IOC

     

     

    public class Girl implements Servicable {

        private Kissable kissable;

        public Girl() {
            kissable = new Boy();
        }

        public void kissYourKissable() {
            kissable.kiss();
        }

    }

     

     

        Girl自己建立自己的Boy,很難更換,很難共享給別人,只能單獨(dú)使用,并負(fù)責(zé)完全的生命周期。

     

        IOC type 1先看代碼:

     

     

    public class Girl implements Servicable {

        Kissable kissable;

        public void service(ServiceManager mgr) {
            kissable = (Kissable) mgr.lookup(kissable);
        }

        public void kissYourKissable() {
            kissable.kiss();
        }

    }

     

     

        這種情況出現(xiàn)于Avalon Framework。一個(gè)組件實(shí)現(xiàn)了Servicable接口,就必須實(shí)現(xiàn)service方法,并傳入一個(gè)ServiceManager。其中會(huì)含有需要的其它組件。只需要在service方法中初始化需要的Boy

        另外,J2EE中從Context取得對象也屬于type 1

     

        它依賴于配置文件

     

    <container>
        <component name=kissable class=Boy">              
           <configuration>
    </configuration>
        </component>

        <component name=girl" class=Girl" />
    </container>

     

     

        IOC type 2

       

     

    public class Girl {

        private Kissable kissable;

        public void setKissable(Kissable kissable) {
            this.kissable = kissable;
        }

        public void kissYourKissable() {
            kissable.kiss();
        }

    }

     

     

        Type 2出現(xiàn)于Spring Framework,是通過JavaBeanset方法來將需要的Boy傳遞給Girl。它必須依賴于配置文件。

           

     

    <beans>
        <bean id=boy" class=Boy"/>
        <bean id=girl class=Girl">
            <property name=kissable">
               <ref bean=boy"/>
            </property>
        </bean>
    </beans>

     

     

    IOC type 3

     

     

    public class Girl {

        private Kissable kissable;

        public Girl(Kissable kissable) {
            this.kissable = kissable;
        }

        public void kissYourKissable() {
            kissable.kiss();
        }

    }

     

     

        這就是PicoContainer的組件 。通過構(gòu)造函數(shù)傳遞BoyGirl

     

     

     

    PicoContainer container = new DefaultPicoContainer();
    container.registerComponentImplementation(Boy.class);
    container.registerComponentImplementation(Girl.class);
    Girl girl = (Girl) container.getComponentInstance(Girl.class);
    girl.kissYourKissable();

     

     

        關(guān)于PicoContainer,作者后續(xù)文章會(huì)詳細(xì)介紹。

     

    作者語:  

        Well,以上的這些理論部分有些已經(jīng)有了新的定義了。過些天我會(huì)再寫一些文章具體說明。比如,原來的三種type結(jié)構(gòu)現(xiàn)在已經(jīng)重新定義為依賴注射的許多層次。

    IoC很年輕,還在發(fā)展。伴隨著IOC的發(fā)展,AOPCOPSOP等等都在不斷的發(fā)展。作為程序員,隨時(shí)關(guān)注著新的思想的發(fā)展是一件很輕松愉快的事情。有沒有人愿意和我一起探討學(xué)習(xí)共同進(jìn)步呀!

       

     

    參考資料

     

        1 本文主要插圖及文字來源于ThoughtWorks公司的Jon Tirsén Aslak Helles?yPicoContainer的兩位開發(fā)者),2003年在Java Polis的演講PPT。有刪改。

    http://www.picocontainer.org/presentations/JavaPolis2003.ppt

    http://www.picocontainer.org/presentations/JavaPolis2003.pdf

     

        2 DIP Robert C Martin, Bob大叔的優(yōu)秀論文

    http://www.objectmentor.com/resources/articles/dip.pdf

     

    3 Dependency Injection 依賴注射,Matrin FowlerDIP的擴(kuò)展

    http://www.martinfowler.com/articles/injection.html

     

    4 IOC框架

    PicoContainer 優(yōu)秀的IOC框架

    http://picocontainer.org/

    Avalon

    http://avalon.apache.org/

    Spring Framework

    http://www.springframework.org/

    HiveMind

    http://jakarta.apache.org/commons/hivemind

     

    5 中文資料

    程序匠:國內(nèi)研究Pico的先驅(qū)

    http://douleimi.vicp.net/space/start

    Jdon:板橋也在研究

    http://www.jdon.com/design.htm

    Spring Framework中文論壇

    http://xglw.51.net/5team/springframework/index.php

    Avalon 中文資料

    http://www.huihoo.org/apache/avalon/introduction.html

    ERPROAD

    http://www.erproad.org/index.asp?vt=bycat&cat_id=37

    Open Heart

    http://blogbus.com/blogbus/blog/index.php?blogid=2529&cat=5

    posted on 2005-08-25 14:48 Java&Inter 閱讀(183) 評論(0)  編輯  收藏 所屬分類: Spring框架

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


    網(wǎng)站導(dǎo)航:
     

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(1)

    隨筆分類(3)

    隨筆檔案(6)

    文章分類(24)

    文章檔案(22)

    收藏夾(2)

    經(jīng)常去的Blog

    • Eclipse/GEF
    • 關(guān)于Eclipse插件(plugins)開發(fā)的心得,主要包括:SWT/JFACE/GEF/EMF/RCP

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产在线不卡免费播放| 免费夜色污私人影院网站| 午夜亚洲WWW湿好爽| 久热综合在线亚洲精品| 伊在人亚洲香蕉精品区麻豆| 亚洲天堂免费在线| 久久国产精品免费视频| 春意影院午夜爽爽爽免费| 精品亚洲av无码一区二区柚蜜| 亚洲综合一区二区| 亚洲国产综合专区电影在线| 区久久AAA片69亚洲| 蜜臀98精品国产免费观看| 国产在线观看无码免费视频| 国产精品亚洲va在线观看| 亚洲熟妇无码av另类vr影视 | 羞羞视频免费网站含羞草| 亚洲五月综合网色九月色| 亚洲毛片免费视频| 亚洲国产精品久久| 久久亚洲AV午夜福利精品一区| 一二三四在线播放免费观看中文版视频| 免费在线中文日本| 在线观看免费视频一区| 中出五十路免费视频| 9久热精品免费观看视频| 亚洲性线免费观看视频成熟| 日韩亚洲AV无码一区二区不卡| 亚洲国产成人片在线观看无码| 亚洲精品乱码久久久久久中文字幕 | 国产成人免费高清在线观看 | 精品国产亚洲AV麻豆| 亚洲av成人无码网站…| 亚洲AV无码资源在线观看| 精品亚洲国产成人av| 四虎一区二区成人免费影院网址| 人人爽人人爽人人片A免费| 精品人妻系列无码人妻免费视频| 国产免费牲交视频免费播放| 成人性做爰aaa片免费看| 无码人妻AV免费一区二区三区|