- Spring DI 教程
- Spring DI - 首頁
- Spring DI - 概述
- Spring DI - 環境設定
- Spring DI - IOC容器
- Spring依賴注入
- Spring DI - 建立專案
- 基於構造器的注入示例
- Spring DI - 基於構造器
- Spring DI - 內部Bean構造器
- Spring DI - 集合構造器
- Spring DI - 集合引用構造器
- Spring DI - Map構造器
- Spring DI - Map引用構造器
- 基於Setter的注入示例
- Spring DI - 基於Setter
- Spring DI - 內部Bean Setter
- Spring DI - 集合Setter
- Spring DI - 集合引用Setter
- Spring DI - Map Setter
- Spring DI - Map引用Setter
- 自動裝配示例
- Spring DI - 自動裝配
- Spring DI - 按名稱自動裝配
- Spring DI - 按型別自動裝配
- Spring DI - 構造器自動裝配
- 工廠方法
- Spring DI - 靜態工廠
- Spring DI - 非靜態工廠
- Spring DI有用資源
- Spring DI - 快速指南
- Spring DI - 有用資源
- Spring DI - 討論
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的DI是透過容器在呼叫無引數構造器或無引數靜態工廠方法來例項化bean之後呼叫bean上的setter方法來實現的。 |
您可以混合使用基於構造器和基於Setter的DI,但一個好的經驗法則是對強制依賴項使用構造器引數,對可選依賴項使用setter。
使用DI原則,程式碼更簡潔,當向物件提供其依賴項時,解耦更有效。物件不查詢其依賴項,也不瞭解依賴項的位置或類,而是Spring框架處理所有這些。
基於構造器與基於Setter的依賴注入。
基於構造器和基於Setter的依賴注入之間存在一些值得注意的差異。
**粒度控制** - 如果構造器接受多個值,則需要在bean配置期間傳遞所有值,而在setter的情況下,可以在特定setter方法中傳遞值,並且可以保留其他setter未配置。
**Setter覆蓋構造器** - 如果同時使用基於構造器和基於setter的注入,則基於setter的注入優先。
**靈活性** - Setter方法不像構造器那樣建立新的bean例項,它們的值也可以更改。