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框架處理。

廣告