下面是Spring開發指南中所說的三種注入方式
我看了
但不太懂
大家也看看
看有沒有更好的理解方式
請給於指點
我的Email
Type 接口注入 我們常常借助接口來將調用者與實現者分離
如:
public class ClassA {
private InterfaceB clzB;
public init() {
Ojbect obj =
Class
forName(Config
BImplementation)
newInstance();
clzB = (InterfaceB)obj;
}
……
}
上面的代碼中
ClassA依賴於InterfaceB的實現
如何獲得InterfaceB實現類的實例?傳統的方法是在代碼中創建InterfaceB實現類的實例
並將起賦予clzB
而這樣一來
ClassA在編譯期即依賴於InterfaceB的實現
為了將調用者與實現者在編譯期分離
於是有了上面的代碼
我們根據預先在配置文件中設定的實現類的類名
動態加載實現類
並通過InterfaceB強制轉型後為ClassA所用
這就是接口注入的一個最原始的雛形
而對於一個Type
型IOC容器而言
加載接口實現並創建其實例的工作由容器完成
如J
EE開發中常用的Context
lookup(ServletContext
getXXX)
都是Type
型IOC的表現形式
Apache Avalon是一個典型的Type
型IOC容器
Type 構造子注入 構造子注入
即通過構造函數完成依賴關系的設定
如
public class DIByConstructor {
private final DataSource dataSource;
private final String message;
public DIByConstructor(DataSource ds
String msg) {
this
dataSource = ds;
ssage = msg;
}
……
}
可以看到
在Type
類型的依賴注入機制中
依賴關系是通過類構造函數建立
容器通過調用類的構造方法
將其所需的依賴關系注入其中
PicoContainer(另一種實現了依賴注入模式的輕量級容器)首先實現了Type
類型的依賴注入模式
Type 設值注入 在各種類型的依賴注入模式中
設值注入模式在實際開發中得到了最廣泛的應用(其中很大一部分得力於Spring框架的影響)
在筆者看來
基於設置模式的依賴注入機制更加直觀
也更加自然
Quick Start中的示例
就是典
SpringFrameWork Developer
s 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
模式各有千秋
而Spring
PicoContainer都對Type
和Type
類型的依賴注入機制提供了良好支持
這也就為我們提供了更多的選擇余地
__________理論上
以Type
類型為主
輔之以Type
類型機制作為補充
可以達到最好的依賴注入效果
不過對於基於Spring Framework開發的應用而言
Type
使用更加廣泛
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28347.html