国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

分享Spring中接口注入的三種方式

2019-11-18 13:00:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  下面是SPRing開(kāi)發(fā)指南中所說(shuō)的三種注入方式,我看了,但不太懂,大家也看看,看有沒(méi)有更好的理解方式,請(qǐng)給于指點(diǎn)。我的Email:zhyiwww@163.com
  
  Type1 接口注入
  
  我們經(jīng)常借助接口來(lái)將調(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。
  
  而這樣一來(lái),ClassA在編譯期即依靠于InterfaceB的實(shí)現(xiàn)。為了將調(diào)用者與實(shí)現(xiàn)者在編譯期分離,于是有了上面的代碼,我們根據(jù)預(yù)先在配置文件中設(shè)定的實(shí)現(xiàn)類的類名,動(dòng)態(tài)加載實(shí)現(xiàn)類,并通過(guò)InterfaceB強(qiáng)制轉(zhuǎn)型后為ClassA所用。
  
  這就是接口注入的一個(gè)最原始的雛形。
  
  而對(duì)于一個(gè)Type1型IOC容器而言,加載接口實(shí)現(xiàn)并創(chuàng)建其實(shí)例的工作由容器完成,如J2EE開(kāi)發(fā)中常用的Context.lookup(ServletContext.getXXX),都是Type1型IOC的表現(xiàn)形式。
  
  Apache Avalon是一個(gè)典型的Type1型IOC容器。
  
  Type2 構(gòu)造子注入
  
  構(gòu)造子注入,即通過(guò)構(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)系是通過(guò)類構(gòu)造函數(shù)建立,容器通過(guò)調(diào)用類的構(gòu)造方法,將其所需的依靠關(guān)系注入其中。
  
  PicoContainer(另一種實(shí)現(xiàn)了依靠注入模式的輕量級(jí)容器)首先實(shí)現(xiàn)了Type2類型的依靠注入模式。
  
  Type3 設(shè)值注入
  
  在各種類型的依靠注入模式中,設(shè)值注入模式在實(shí)際開(kāi)發(fā)中得到了最廣泛的應(yīng)用(其中很大一部分得力于Spring框架的影響)。
  
  在筆者看來(lái),基于設(shè)置模式的依靠注入機(jī)制更加直觀、也更加自然。Quick Start中的示例,就是典
  SpringFrameWork Developer’s Guide Version 0.6
  September 2, 2004 So many open source projects. Why not Open your Documents?
  
  型的設(shè)置注入,即通過(guò)類的setter方法完成依靠關(guān)系的設(shè)置。
  
  幾種依靠注入模式的對(duì)比總結(jié)
  
  接口注入模式因?yàn)榫邆淝秩胄裕?a href="http://www.survivalescaperooms.com/tag-14.html">組件必須與特定的接口相關(guān)聯(lián),因此并不被看好,實(shí)際使用有限。
  
  Type2和Type3的依靠注入實(shí)現(xiàn)模式均具備無(wú)侵入性的特點(diǎn)。在筆者看來(lái),這兩種實(shí)現(xiàn)方式各有特點(diǎn),也各具優(yōu)勢(shì)(一句經(jīng)典廢話?)。
  
  Type2 構(gòu)造子注入的優(yōu)勢(shì):
  
  1. “在構(gòu)造期即創(chuàng)建一個(gè)完整、合法的對(duì)象”,對(duì)于這條java設(shè)計(jì)原則,Type2無(wú)疑是最好的響應(yīng)者。
  
  2. 避免了繁瑣的setter方法的編寫,所有依靠關(guān)系均在構(gòu)造函數(shù)中設(shè)定,依靠關(guān)系集中呈現(xiàn),更加易讀。
  
  3. 由于沒(méi)有setter方法,依靠關(guān)系在構(gòu)造時(shí)由容器一次性設(shè)定,因此組件在被創(chuàng)建之后即處相對(duì)“不變”的穩(wěn)定狀態(tài),無(wú)需擔(dān)心上層代碼在調(diào)用過(guò)程中執(zhí)行setter方法對(duì)組件依靠關(guān)系產(chǎn)生破壞,非凡是對(duì)于Singleton模式的組件而言,這可能對(duì)整個(gè)系統(tǒng)產(chǎn)生重大的影響。
  
  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)的層次清楚性提供了保證。
  
  5. 通過(guò)構(gòu)造子注入,意味著我們可以在構(gòu)造函數(shù)中決定依靠關(guān)系的注入順序,對(duì)于一個(gè)大量依靠外部服務(wù)的組件而言,依靠關(guān)系的獲得順序可能非常重要,比如某個(gè)依靠關(guān)系注入的先決條件是組件的DataSource及相關(guān)資源已經(jīng)被設(shè)定。
  
  Type3 設(shè)值注入的優(yōu)勢(shì)
  
  1. 對(duì)于習(xí)慣了傳統(tǒng)JavaBean開(kāi)發(fā)的程序員而言,通過(guò)setter方法設(shè)定依靠關(guān)系顯得更加直觀,更加自然。
  
  2. 假如依靠關(guān)系(或繼續(xù)關(guān)系)較為復(fù)雜,那么Type2模式的構(gòu)造函數(shù)也會(huì)相當(dāng)龐大(我們需要在構(gòu)造函數(shù)中設(shè)定所有依靠關(guān)系),此時(shí)Type3模式往往更為簡(jiǎn)潔。
  
  3. 對(duì)于某些第三方類庫(kù)而言,可能要求我們的組件必須提供一個(gè)默認(rèn)的構(gòu)造函數(shù)(如Struts中的Action),此時(shí)Type2類型的依靠注入機(jī)制就體現(xiàn)出其局限性,難以完成我們期望的功能。
  
  可見(jiàn),Type2和Type3模式各有千秋,而Spring、PicoContainer都對(duì)Type2和Type3類型的依靠注入機(jī)制提供了良好支持。這也就為我們提供了更多的選擇余地。__________理論上,以Type2類型為主,輔之以Type3類型機(jī)制作為補(bǔ)充,可以達(dá)到最好的依靠注入效果,不過(guò)對(duì)于基于Spring Framework開(kāi)發(fā)的應(yīng)用而言,Type3使用更加廣泛。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 孟津县| 防城港市| 五大连池市| 修文县| 辽阳县| 舒城县| 桃江县| 冀州市| 常熟市| 扶沟县| 于田县| 逊克县| 铁岭县| 沽源县| 石景山区| 桃园市| 遂昌县| 海淀区| 通海县| 新郑市| 阿瓦提县| 怀集县| 高雄县| 鞍山市| 舞钢市| 新野县| 大埔县| 自贡市| 高雄县| 玛多县| 兰州市| 萨嘎县| 盐亭县| 荆门市| 保定市| 东安县| 城固县| 罗城| 樟树市| 衡阳县| 阳山县|