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

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

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

    Sung in Blog

               一些技術(shù)文章 & 一些生活雜碎

    Type1 接口注入

    我們常常借助接口來將調(diào)用者與實(shí)現(xiàn)者分離。如:

    ?

    public class ClassA {
    private InterfaceB clzB;
    public init() {
    Ojbect obj =
    Class.forName(Config.BImplementation).newInstance();
    clzB = (InterfaceB)obj;
    }
    ……
    }

      上面的代碼中,ClassA依賴于InterfaceB的實(shí)現(xiàn),如何獲得InterfaceB實(shí)現(xiàn)類的實(shí)例?傳統(tǒng)的方法是在代碼中創(chuàng)建InterfaceB實(shí)現(xiàn)類的實(shí)例,并將起賦予clzB。而這樣一來,ClassA在編譯期即依賴于InterfaceB的實(shí)現(xiàn)。為了將調(diào)用者與實(shí)現(xiàn)者在編譯期分離,于是有了上面的代碼,我們根據(jù)預(yù)先在配置文件中設(shè)定的實(shí)現(xiàn)類的類名,動(dòng)態(tài)加載實(shí)現(xiàn)類,并通過InterfaceB強(qiáng)制轉(zhuǎn)型后為ClassA所用。

      這就是接口注入的一個(gè)最原始的雛形。

      而對(duì)于一個(gè)Type1型IOC容器而言,加載接口實(shí)現(xiàn)并創(chuàng)建其實(shí)例的工作由容器完成,如J2EE開發(fā)中常用的Context.lookup(ServletContext.getXXX),都是Type1型IOC的表現(xiàn)形式。Apache Avalon是一個(gè)典型的Type1型IOC容器。

      Type2 構(gòu)造子注入

      構(gòu)造子注入,即通過構(gòu)造函數(shù)完成依賴關(guān)系的設(shè)定,如:
    public class DIByConstructor
    {
    private final DataSource dataSource;
    private final String message;
    public DIByConstructor(DataSource ds, String msg)
    {
    this.dataSource = ds;
    this.message = msg;
    }
    ……
    }

      可以看到,在Type2類型的依賴注入機(jī)制中,依賴關(guān)系是通過類構(gòu)造函數(shù)建立,容器通過調(diào)用類的構(gòu)造方法,將其所需的依賴關(guān)系注入其中。PicoContainer(另一種實(shí)現(xiàn)了依賴注入模式的輕量級(jí)容器)首先實(shí)現(xiàn)了Type2類型的依賴注入模式。

      Type3 設(shè)值注入

      在各種類型的依賴注入模式中,設(shè)值注入模式在實(shí)際開發(fā)中得到了最廣泛的應(yīng)用(其中很大一部分得力于Spring框架的影響)。

      在筆者看來,基于設(shè)置模式的依賴注入機(jī)制更加直觀、也更加自然。Quick Start中的示例,就是典型的設(shè)置注入,即通過類的setter方法完成依賴關(guān)系的設(shè)置。

      幾種依賴注入模式的對(duì)比總結(jié)

      接口注入模式因?yàn)榫邆淝秩胄裕蠼M件必須與特定的接口相關(guān)聯(lián),因此并不被看好,實(shí)際使用有限。Type2和Type3的依賴注入實(shí)現(xiàn)模式均具備無侵入性的特點(diǎn)。

      Type2 構(gòu)造子注入的優(yōu)勢(shì):

      1、“在構(gòu)造期即創(chuàng)建一個(gè)完整、合法的對(duì)象”,對(duì)于這條Java設(shè)計(jì)原則,Type2無疑是最好的響應(yīng)者。

      我的理解:就是你要通過一種方式來保證對(duì)象的引用完整性,type2選擇了構(gòu)造器的方式來實(shí)現(xiàn)。

      2、避免了繁瑣的setter方法的編寫,所有依賴關(guān)系均在構(gòu)造函數(shù)中設(shè)定,依賴關(guān)系集中呈現(xiàn),更加易讀。

      我的理解:使用構(gòu)造方法就不需要每個(gè)屬性都寫set和get方法了,這樣省去了很多的代碼。

      3、由于沒有setter方法,依賴關(guān)系在構(gòu)造時(shí)由容器一次性設(shè)定,因此組件在被創(chuàng)建之后即處于相對(duì)“不變”的穩(wěn)定狀態(tài),無需擔(dān)心上層代碼在調(diào)用過程中執(zhí)行setter方法對(duì)組件依賴關(guān)系產(chǎn)生破壞,特別是對(duì)于Singleton模式的組件而言,這可能對(duì)整個(gè)系統(tǒng)產(chǎn)生重大的影響。

      我的理解:使用構(gòu)造器來實(shí)現(xiàn),那么你需要一次對(duì)所有的屬性都初始話,相對(duì)set方法來說,缺少了一些靈活性。

      4、同樣,由于關(guān)聯(lián)關(guān)系僅在構(gòu)造函數(shù)中表達(dá),只有組件創(chuàng)建者需要關(guān)心組件內(nèi)部的依賴關(guān)系。對(duì)調(diào)用者而言,組件中的依賴關(guān)系處于黑盒之中。對(duì)上層屏蔽不必要的信息,也為系統(tǒng)的層次清晰性提供了保證。

      我的理解: spring的這設(shè)計(jì)就是要屏蔽依賴關(guān)系,你只需要對(duì)接口編程,而不需要考慮依賴關(guān)系的實(shí)現(xiàn)。所以對(duì)調(diào)用者來說,依賴關(guān)系是處于黑盒當(dāng)中。

      5、通過構(gòu)造子注入,意味著我們可以在構(gòu)造函數(shù)中決定依賴關(guān)系的注入順序,對(duì)于一個(gè)大量依賴外部服務(wù)的組件而言,依賴關(guān)系的獲得順序可能非常重要,比如某個(gè)依賴關(guān)系注入的先決條件是組件的DataSource及相關(guān)資源已經(jīng)被設(shè)定。

      我的理解:關(guān)于順序問題,我們來看以下兩段代碼:
    public DIByConstructor(DataSource ds, String msg)
    {
    this.dataSource = ds;
    this.message = msg;
    }
    public DIByConstructor(DataSource ds, String msg)
    {
    this.dataSource = ds;
    this.message = msg;
    }

      在本例中,順序不太重要,但是如果message的初始化需要用到datasource的話,那么就必須要先初始化datasource,所以相對(duì)來說,順序就是確定了。

      Type3 設(shè)值注入的優(yōu)勢(shì)

      1、對(duì)于習(xí)慣了傳統(tǒng)JavaBean開發(fā)的程序員而言,通過setter方法設(shè)定依賴關(guān)系顯得更加直觀,更加自然。

      2、如果依賴關(guān)系(或繼承關(guān)系)較為復(fù)雜,那么Type2模式的構(gòu)造函數(shù)也會(huì)相當(dāng)龐大(我們需要在構(gòu)造函數(shù)中設(shè)定所有依賴關(guān)系),此時(shí)Type3模式往往更為簡潔。

      我的理解:依賴關(guān)系(或繼承關(guān)系)較為復(fù)雜,指的是,屬性較多,需要寫很多的set和get方法。

      3、對(duì)于某些第三方類庫而言,可能要求我們的組件必須提供一個(gè)默認(rèn)的構(gòu)造函數(shù)(如Struts中的Action),此時(shí)Type2類型的依賴注入機(jī)制就體現(xiàn)出其局限性,難以完成我們期望的功能。

      可見,Type2和Type3模式各有千秋,而Spring、PicoContainer都對(duì)Type2和Type3類型的依賴注入機(jī)制提供了良好支持。這也就為我們提供了更多的選擇余地。理論上,以Type2類型為主,輔之以Type3類型機(jī)制作為補(bǔ)充,可以達(dá)到最好的依賴注入效果,不過對(duì)于基于Spring Framework開發(fā)的應(yīng)用而言,Type3使用更加廣泛。

    posted on 2005-10-16 12:58 Sung 閱讀(378) 評(píng)論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 国产色爽女小说免费看| 亚洲Av无码专区国产乱码DVD| 无忧传媒视频免费观看入口| 国产亚洲精午夜久久久久久| 91成人免费观看| 亚洲乱码av中文一区二区| 亚洲精品无码乱码成人| 在线观看免费宅男视频| a级在线免费观看| 亚洲综合激情五月丁香六月| 国产成人综合亚洲AV第一页| 免费AA片少妇人AA片直播 | 久久久久亚洲精品无码网址色欲| 亚洲精品无码日韩国产不卡?V| 久久精品免费观看国产| 小说专区亚洲春色校园| 亚洲视频在线观看| 亚洲AV无码一区二三区| 日韩免费一区二区三区在线播放| 一二三四在线观看免费中文在线观看| 精品日韩亚洲AV无码| 亚洲精品国产精品乱码不卡| 国产成人精品免费午夜app | 伊人免费在线观看高清版| 亚洲另类无码一区二区三区| 亚洲精品免费视频| 国产成人免费a在线视频色戒| 日本免费大黄在线观看| 一级黄色免费大片| 亚洲人成人伊人成综合网无码| 亚洲第一视频网站| 亚洲午夜精品一级在线播放放| 毛片免费观看的视频在线| 亚洲国产精品免费视频| 一级做a爱过程免费视频高清| 亚洲中文字幕无码久久2020| 亚洲视频国产精品| 婷婷精品国产亚洲AV麻豆不片| 亚洲色欲久久久久综合网| 成人永久免费高清| 猫咪社区免费资源在线观看 |