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

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

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

    常言笑的家

    Spring, Hibernate, Struts, Ajax, RoR

    控制反轉(zhuǎn),依賴注入,好萊塢原則

    IoC 或者 DI 或者 …一大堆的縮寫詞
    依賴注入和控制反轉(zhuǎn)其實是同一回事,依賴注入最典型的應用就是控制反轉(zhuǎn)

    不管是面向?qū)ο螅€是面向過程,都需要分成許多的塊,然后由這些部件協(xié)同工作完成任務
    要協(xié)同工作就會產(chǎn)生依賴,一個方法調(diào)用另一個方法,一個對象包含另一個對象
    如果對象A包含對象B的話,就需要在A里new一個B
    依賴注入從具體類B里抽象出接口IB——IB的具體實現(xiàn)可能有很多B,B1,B2…很多種——這樣A可以不用再new具體的B了,而是跟IoC容器說:我要一個IB(getBean("IB"))。然后,由容器根據(jù)配置文件來做具體的new的工作。具體new的是哪個,由配置文件從代碼外部決定,要更換成B,B1,或是B2…修改配置文件就能做到,不用再改代碼了

    例:
    假設你編寫了兩個類,一個是人(Person),一個是手機(Mobile)。
    人有時候需要用手機打電話,需要用到手機的dialUp方法。
    傳統(tǒng)的寫法是這樣:

    //code
    public class Person
        
    public boolean makeCall(long number)
            Mobile mobile
    =new Mobile(); 
            
    return mobile.dialUp(number); 
        }
     
    }

    也就是說,類Person的makeCall方法對Mobile類具有依賴,必須手動生成一個新的實例new Mobile()才可以進行之后的工作。
    依賴注入的思想是這樣,當一個類(Person)對另一個類(Mobile)有依賴時,不再該類(Person)內(nèi)部對依賴的類(Moblile)進行實例化,而是之前配置一個beans.xml,告訴容器所依賴的類(Mobile),在實例化該類(Person)時,容器自動注入一個所依賴的類(Mobile)的實例。
    接口
    //code
    public Interface MobileInterface
        
    public boolean dialUp(long number);
    }


    Person類:
    //code
    public class Person{
        
    private MobileInterface mobileInterface;
        
    public boolean makeCall(long number){
            
    return this.mobileInterface.dialUp(number);
        }

        
    public void setMobileInterface(MobileInterface mobileInterface){
            
    this.mobileInterface=mobileInterface;
        }

    }


    在xml文件中配置依賴關系
    //code
    <bean class="Person" id="person">
         
    <property name="mobileInterface">
             
    <ref local="mobileInterface"></ref>
         
    </property>
    </bean> 
    <bean class="Mobile" id="mobileInterface"></bean>
    這樣,Person類在實現(xiàn)撥打電話的時候,并不知道Mobile類的存在,它只知道調(diào)用一個接口MobileInterface,而MobileInterface的具體實現(xiàn)是通過Mobile類完成,并在使用時由容器自動注入,這樣大大降低了不同類間相互依賴的關系。

    什么叫控制反轉(zhuǎn)呢?
    套用好萊塢的一句名言就是:你呆著別動,到時我會找你。
    什么意思呢?就好比一個皇帝和太監(jiān)
    有一天皇帝想幸某個美女,于是跟太監(jiān)說,今夜我要寵幸美女
    皇帝往往不會告訴太監(jiān),今晚幾點會回宮,會回哪張龍床,他只會告訴太監(jiān)他要哪位美女
    其它一切都交由太監(jiān)去安排,到了晚上皇帝回宮時,自然會有美女出現(xiàn)在皇帝的龍床上
    這就是控制反轉(zhuǎn),而把美女送到皇帝的寢宮里面去就是注射
    太監(jiān)就是是框架里面的注射控制器類BeanFactory,負責找到美女并送到龍床上去
    整個后宮可以看成是Spring框架,美女就是Spring控制下的JavaBean
    而傳統(tǒng)的模式就是一個饑渴男去找小姐出臺
    找領班,幫助給介紹一個云云,于是領班就開始給他張羅
    介紹一個合適的給他,完事后,再把小姐還給領班,下次再來
    這個過程中,領班就是查詢上下文Context,領班的一個職能就是給客戶找到他們所要的小姐
    這就是lookup()方法,領班手中的小姐名錄就是JNDI//Java Naming and Directory Interface
    小姐就是EJB,饑渴男是客戶端,青樓是EJB容器
    看到區(qū)別了么?饑渴男去找小姐出臺很麻煩,不僅得找,用完后還得把小姐給還回去
    而皇帝爽翻了,什么都不用管,交給太監(jiān)去處理,控制權轉(zhuǎn)移到太監(jiān)手中去了
    而不是皇帝,必要時候由太監(jiān)給注射進去就可以了
    看到Spring的美妙了吧,Spring還提供了與多個主流框架的支持
    可以和其它開源框架集成 

    posted on 2010-07-19 11:21 常言笑 閱讀(1462) 評論(0)  編輯  收藏 所屬分類: 技術總結

    My Links

    Blog Stats

    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 全免费a级毛片免费**视频| 无套内谢孕妇毛片免费看看| 久久综合图区亚洲综合图区| 亚洲精品无码专区久久久| 亚洲AV无码国产精品麻豆天美| 亚洲AV无码乱码国产麻豆| 国产免费AV片在线观看播放| 无码精品人妻一区二区三区免费看 | 久久综合亚洲色HEZYO国产| 国产亚洲美日韩AV中文字幕无码成人| 久久久久久久久无码精品亚洲日韩| 一级做a爰片久久免费| 最近中文字幕电影大全免费版 | 成人毛片免费网站| 亚洲区小说区图片区| 亚洲高清美女一区二区三区| 亚洲精品一卡2卡3卡四卡乱码| 人体大胆做受免费视频| 一个人免费观看视频www| 国产亚洲精品线观看动态图| 国产JIZZ中国JIZZ免费看| 91免费资源网站入口| 亚洲国产成人AV网站| 亚洲精品乱码久久久久久久久久久久| 热99RE久久精品这里都是精品免费 | 亚洲成人黄色在线观看| 丁香花在线视频观看免费| 亚洲成AV人片在线观看| 曰批免费视频播放在线看片二| 久久久久噜噜噜亚洲熟女综合| 毛片免费在线观看| 亚洲自偷自偷图片| 国产免费一区二区三区免费视频 | 永久免费无码网站在线观看| 猫咪www免费人成网站| 免费观看的av毛片的网站| 猫咪免费人成网站在线观看入口 | 国产精品亚洲综合久久| 2015日韩永久免费视频播放| 亚洲av日韩av天堂影片精品| 一区二区三区在线免费观看视频|