
- Spring核心基礎
- Spring - 首頁
- Spring - 概述
- Spring - 架構
- Spring - 環境設定
- Spring - HelloWorld示例
- Spring - IoC容器
- Spring - Bean定義
- Spring - Bean作用域
- Spring - Bean生命週期
- Spring - Bean後處理器
- Spring - Bean定義繼承
- Spring - 依賴注入
- Spring - 注入內部Bean
- Spring - 注入集合
- Spring - Bean自動裝配
- 基於註解的配置
- Spring - 基於Java的配置
- Spring - Spring中的事件處理
- Spring - Spring中的自定義事件
- Spring - Spring框架中的AOP
- Spring - JDBC框架
- Spring - 事務管理
- Spring - Web MVC框架
- Spring - 使用Log4J進行日誌記錄
- Spring問答
- Spring - 問答
- Spring有用資源
- Spring - 快速指南
- Spring - 有用資源
- Spring - 討論
Spring - 依賴注入
每個基於Java的應用程式都有一些物件協同工作,最終呈現給使用者一個可執行的應用程式。在編寫複雜的Java應用程式時,應用程式類應儘可能獨立於其他Java類,以增加重用這些類的可能性,並在單元測試時獨立於其他類對其進行測試。依賴注入(有時稱為依賴注入)有助於將這些類粘合在一起,同時保持它們的獨立性。
假設您有一個包含文字編輯器元件的應用程式,並且您想提供拼寫檢查功能。您的標準程式碼如下所示:
public class TextEditor { private SpellChecker spellChecker; public TextEditor() { spellChecker = new SpellChecker(); } }
我們在這裡所做的是在TextEditor和SpellChecker之間建立了依賴關係。在控制反轉場景中,我們將執行以下操作:
public class TextEditor { private SpellChecker spellChecker; public TextEditor(SpellChecker spellChecker) { this.spellChecker = spellChecker; } }
在這裡,TextEditor無需擔心SpellChecker的實現。SpellChecker將獨立實現,並在TextEditor例項化時提供給TextEditor。整個過程由Spring框架控制。
在這裡,我們消除了TextEditor的全部控制權,並將其保留在其他地方(即XML配置檔案中),並且依賴項(即類SpellChecker)透過**類建構函式**注入到類TextEditor中。因此,控制流已被依賴注入(DI)“反轉”,因為您已有效地將依賴關係委託給某個外部系統。
注入依賴的第二種方法是透過TextEditor類的**Setter方法**,我們將建立一個SpellChecker例項。此例項將用於呼叫setter方法來初始化TextEditor的屬性。
因此,DI存在兩種主要變體,以下兩個子章節將分別舉例說明:
序號 | 依賴注入型別及描述 |
---|---|
1 | 基於建構函式的依賴注入
當容器呼叫具有多個引數的類建構函式時,每個引數代表對其他類的依賴,就會實現基於建構函式的DI。 |
2 | 基於Setter的依賴注入
基於Setter的DI是透過容器在呼叫無引數建構函式或無引數靜態工廠方法來例項化bean後,呼叫bean上的setter方法來實現的。 |
您可以混合使用基於建構函式和基於Setter的DI,但是一個好的經驗法則是使用建構函式引數表示強制依賴項,使用setter表示可選依賴項。
使用DI原則,程式碼更簡潔,當為物件提供其依賴項時,解耦更加有效。物件不會查詢其依賴項,也不知道依賴項的位置或類,所有這一切都由Spring框架處理。