?引用類型的注入:Setter方法
?簡單類型的注入:
定義簡單實例和方法
在配置文件中對bean進行配置,使用porperty屬性 值用value(ref是用來獲取bean的)
構造器方法:
構造器方法中需要寫name,這樣程序就會耦合度高。
使用type="java.lang.string"替換掉名稱,可以解決形參名稱耦合度高問題
使用index=0 索引值,當參數中有類型相同的,它可以解決參數相同問題。
總結:
Setter注入:Setter注入通過類的Setter方法(即屬性設置方法)注入依賴對象。
- 靈活性高:可以在對象創建后動態修改依賴,適用于可選依賴或可能變化的依賴項。
- 代碼可讀性好:Setter方法通常具有明確的命名(如
setService()
),便于理解注入的內容。 - 可能導致部分初始狀態不完整:由于依賴在對象創建后設置,可能在對象初始化時某些依賴未準備好,導致運行時錯誤。
public class UserService {private UserRepository userRepository;// Setter方法注入public void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
}
構造器注入:構造器注入通過類的構造函數傳入依賴對象,確保對象在創建時所有依賴已就緒。
- 強依賴性保證:對象一旦創建,依賴關系即確定,避免運行時因依賴缺失導致的錯誤。
- 適合強制依賴:適用于必須提供的依賴項,確保對象始終處于有效狀態。
- 不可變性支持:結合
final
關鍵字(如Java),可以保證依賴對象不可變,提高線程安全性。 - 靈活性較低:一旦對象創建,依賴關系無法更改,不適合可選依賴或動態依賴場景。
public class UserService {private final UserRepository userRepository;// 構造器注入public UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}
主要區別
特性 | Setter注入 | 構造器注入 |
---|---|---|
依賴時機 | 對象創建后設置 | 對象創建時設置 |
依賴可變性 | 可動態修改 | 通常不可變(如結合final ) |
適用場景 | 可選依賴、動態配置 | 強制依賴、不可變對象 |
代碼安全性 | 可能因依賴缺失導致運行時錯誤 | 編譯時或創建時檢查依賴完整性 |
框架支持 | 廣泛支持(如Spring的XML/注解) | 廣泛支持(推薦現代框架默認使用) |
選擇建議
- 優先構造器注入:現代框架(如Spring 4.3+)推薦默認使用構造器注入,因其更強的安全性和不可變性支持。
- Setter注入適用場景:需要動態重新綁定依賴(如熱部署)、可選依賴或遺留代碼兼容時使用。