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

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

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

    posts - 28,  comments - 15,  trackbacks - 0

    一、什么是IOC

    IoC就是Inversion of Control,控制反轉。在Java開發中,IoC意味著將你設計好的類交給系統去控制,而不是在你的類內部控制。這稱為控制反轉。

     

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

     

    假設我們要設計一個Girl和一個Boy類,其中Girlkiss方法,即Girl想要Kiss一個Boy。那么,我們的問題是,Girl如何能夠認識這個Boy

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

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

     

        那么哪一種才是最好呢?

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

       

       

     

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

     

     

        然而從開始就創建的Boy缺點就是無法在更換。并且要負責Boy的整個生命周期。如果我們的Girl想要換一個怎么辦?(筆者嚴重不支持Girl經常更換Boy

     

        親友介紹:由中間人負責提供Boy來見面

           


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

     

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

     

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

     

          


    public

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

        Well,這是對Girl最好的方法,只要想辦法賄賂了Girl的父母,并把Boy交給他。那么我們就可以輕松的和GirlKiss了??磥韼浊陚鹘y的父母之命還真是有用哦。至少BoyGirl不用自己瞎忙乎了。

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

     

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

     

        我們還應該知道依賴倒轉原則 Dependence Inversion PrincinpleDIP。

     

    Eric Gamma說,要面向抽象編程。面向接口編程是面向對象的核心。

    組件應該分為兩部分,即

    Service, 所提供功能的聲明

    Implementation, Service的實現

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

    所以,我們的Boy應該是實現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,很難更換,很難共享給別人,只能單獨使用,并負責完全的生命周期。

     

        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();
        }

    }

     

     

        這種情況出現于Avalon Framework。一個組件實現了Servicable接口,就必須實現service方法,并傳入一個ServiceManager。其中會含有需要的其它組件。只需要在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出現于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的組件 。通過構造函數傳遞BoyGirl。

     

     

     

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

     

     

        關于PicoContainer,作者后續文章會詳細介紹。

     

    作者語:  

        Well,以上的這些理論部分有些已經有了新的定義了。過些天我會再寫一些文章具體說明。比如,原來的三種type結構現在已經重新定義為依賴注射的許多層次。

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

    摘自:http://dev.csdn.net/develop/article/24/24397.shtm

    posted on 2011-04-21 10:13 zhangxl 閱讀(346) 評論(0)  編輯  收藏 所屬分類: Spring
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(1)

    隨筆分類(17)

    隨筆檔案(28)

    文章分類(30)

    文章檔案(30)

    相冊

    收藏夾(2)

    hibernate

    java基礎

    mysql

    xml

    關注

    壓力測試

    算法

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 96776
    • 排名 - 600

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: a级毛片无码免费真人| 野花香在线视频免费观看大全| 免费黄色电影在线观看| 自拍偷自拍亚洲精品第1页| 无人视频在线观看免费播放影院 | 亚洲欧洲自拍拍偷精品 美利坚 | 中文字幕在线免费播放| 一个人看的www在线观看免费| 精品亚洲成AV人在线观看| a级精品九九九大片免费看| 国产中文在线亚洲精品官网| 2022免费国产精品福利在线| 亚洲精品第一国产综合精品99| 成人福利在线观看免费视频| 亚洲精品456播放| 中文字幕的电影免费网站| 亚洲人成人网站色www| 免费无码毛片一区二区APP| 亚洲激情视频网站| 97无码免费人妻超级碰碰碰碰 | 国产精品亚洲а∨天堂2021| 又爽又高潮的BB视频免费看| 九九九精品视频免费| 国产亚洲色婷婷久久99精品| 日韩精品内射视频免费观看| 亚洲国产亚洲综合在线尤物| 午夜一区二区免费视频| eeuss影院免费直达入口| 无码专区—VA亚洲V天堂| 日本亚洲免费无线码| 国产亚洲视频在线观看网址| 中文字幕亚洲无线码| 37pao成人国产永久免费视频| 国产人成亚洲第一网站在线播放| 日本免费一区尤物| 中文字幕无码免费久久9一区9 | 亚洲成a人无码亚洲成www牛牛 | 全部免费a级毛片| a级毛片高清免费视频就| 亚洲国产中文在线视频| 亚洲?V无码乱码国产精品|