熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

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

2013-11-23 20:20:59  來源: Java開源技術 

  下面是Spring開發指南中所說的三種注入方式我看了但不太懂大家也看看看有沒有更好的理解方式請給於指點我的Email
  
  Type 接口注入
  
  我們常常借助接口來將調用者與實現者分離如:
  public class ClassA {
  private InterfaceB clzB;
  public init() {
  Ojbect obj =
  ClassforName(ConfigBImplementation)newInstance();
  clzB = (InterfaceB)obj;
  }
  ……
  }
  
  上面的代碼中ClassA依賴於InterfaceB的實現如何獲得InterfaceB實現類的實例?傳統的方法是在代碼中創建InterfaceB實現類的實例並將起賦予clzB
  
  而這樣一來ClassA在編譯期即依賴於InterfaceB的實現為了將調用者與實現者在編譯期分離於是有了上面的代碼我們根據預先在配置文件中設定的實現類的類名動態加載實現類並通過InterfaceB強制轉型後為ClassA所用
  
  這就是接口注入的一個最原始的雛形
  
  而對於一個Type型IOC容器而言加載接口實現並創建其實例的工作由容器完成如JEE開發中常用的Contextlookup(ServletContextgetXXX)都是Type型IOC的表現形式
  
  Apache Avalon是一個典型的Type型IOC容器
  
  Type 構造子注入
  
  構造子注入即通過構造函數完成依賴關系的設定
  public class DIByConstructor {
  private final DataSource dataSource;
  private final String message;
  public DIByConstructor(DataSource ds String msg) {
  thisdataSource = ds;
  ssage = msg;
  }
  ……
  }
  
  可以看到在Type類型的依賴注入機制中依賴關系是通過類構造函數建立容器通過調用類的構造方法將其所需的依賴關系注入其中
  
  PicoContainer(另一種實現了依賴注入模式的輕量級容器)首先實現了Type類型的依賴注入模式
  
  Type 設值注入
  
  在各種類型的依賴注入模式中設值注入模式在實際開發中得到了最廣泛的應用(其中很大一部分得力於Spring框架的影響)
  
  在筆者看來基於設置模式的依賴注入機制更加直觀也更加自然Quick Start中的示例就是典
  SpringFrameWork Developers Guide Version
  September So many open source projects Why not Open your Documents?
  
  型的設置注入即通過類的setter方法完成依賴關系的設置
  
  幾種依賴注入模式的對比總結
  
  接口注入模式因為具備侵入性它要求組件必須與特定的接口相關聯因此並不被看好實際使用有限
  
  Type和Type的依賴注入實現模式均具備無侵入性的特點在筆者看來這兩種實現方式各有特點也各具優勢(一句經典廢話?)
  
  Type 構造子注入的優勢
  
  在構造期即創建一個完整合法的對象對於這條Java設計原則Type無疑是最好的響應者
  
  . 避免了繁瑣的setter方法的編寫所有依賴關系均在構造函數中設定依賴關系集中呈現更加易讀
  
  . 由於沒有setter方法依賴關系在構造時由容器一次性設定因此組件在被創建之後即處相對不變的穩定狀態無需擔心上層代碼在調用過程中執行setter方法對組件依賴關系產生破壞特別是對於Singleton模式的組件而言這可能對整個系統產生重大的影響
  
  . 同樣由於關聯關系僅在構造函數中表達只有組件創建者需要關心組件內部的依賴關系對調用者而言組件中的依賴關系處於黑盒之中對上層屏蔽不必要的信息也為系統的層次清晰性提供了保證
  
   通過構造子注入意味著我們可以在構造函數中決定依賴關系的注入順序對於一個大量依賴外部服務的組件而言依賴關系的獲得順序可能非常重要比如某個依賴關系注入的先決條件是組件的DataSource及相關資源已經被設定
  
  Type 設值注入的優勢
  
   對於習慣了傳統JavaBean開發的程序員而言通過setter方法設定依賴關系顯得更加直觀更加自然
  
   如果依賴關系(或繼承關系)較為復雜那麼Type模式的構造函數也會相當龐大(我們需要在構造函數中設定所有依賴關系)此時Type模式往往更為簡潔
  
   對於某些第三方類庫而言可能要求我們的組件必須提供一個默認的構造函數(如Struts中的Action)此時Type類型的依賴注入機制就體現出其局限性難以完成我們期望的功能
  
  可見Type和Type模式各有千秋而SpringPicoContainer都對Type和Type類型的依賴注入機制提供了良好支持這也就為我們提供了更多的選擇余地__________理論上以Type類型為主輔之以Type類型機制作為補充可以達到最好的依賴注入效果不過對於基於Spring Framework開發的應用而言Type使用更加廣泛

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28347.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.